gcc 4.4.3 c89
我有以下源代码。并在printf上获得堆栈转储。
char **devices;
devices = malloc(10 * sizeof(char*));
strcpy(devices[0], "smxxxx1");
printf("[ %s ]\n", devices[0]); /* Stack dump trying to print */
我认为这应该创建一个这样的char数组。
devices[0]
devices[1]
devices[2]
devices[4]
etc
每个元素我都可以存储我的字符串。
非常感谢任何建议,
==添加了更正===
for(i = 0; i < 10; i++)
{
devices[i] = malloc(strlen("smxxxx1")+1);
}
答案 0 :(得分:5)
您已为指针数组分配内存。您需要为每个元素分配内存以存储字符串
e.g。
#define NUM_ELEMENTS 10
char **devices;
devices = malloc(NUM_ELEMENTS * sizeof(char*));
for ( int i = 0; i < NUM_ELEMENTS; i++)
{
devices[i] = malloc( length_of string + 1 );
}
答案 1 :(得分:4)
设备[0]是char *
,但您尚未为其分配任何存储空间。这样做:
char **devices;
devices = malloc(10 * sizeof(char*));
devices[0] = strdup("smxxxx1");
printf("[ %s ]\n", devices[0]);
最终,您必须释放strdup()
分配的内存:
free(devices[0]);
答案 2 :(得分:3)
您已分配内存以存储10个char 指针。要在这些内存位置存储字符串,您必须为每个内存位置分配内存。基本上,每个指针都需要device[0] = malloc(stringLen + 1);
之类的东西。
答案 3 :(得分:2)
您只分配了一个指向字符数组的指针数组。 您必须为计划存储的每个字符串分配内存:
char **devices;
devices = malloc(10 * sizeof(char*));
//Added this line:
devices[0] = (char*)malloc(strlen("smxxxx1")+1);
strcpy(devices[0], "smxxxx1\0");
printf("[ %s ]\n", devices[0]); /* Stack dump trying to print */
答案 4 :(得分:1)
你已经为指针(设备)分配了空间,但没有为你要存储的字符串分配空间。
答案 5 :(得分:0)
devices是一个指针数组。您正在复制字符串“smxxxx1” over 数组,当您想要将元素0设置为指向字符串时。
而不是strcpy()尝试:
devices[0] = "smxxxx1"
或
devices[0] = strdup("smxxxx1")
修改强>
在32位系统上,设备[0]由四个字节组成。这四个字节被字符串“smxxxx1”的前四个字符的字节值覆盖。在ascii中,这些是0x73,0x6D,0x78,0x78。假设little-endian寻址,您最终会使用包含指向地址0x78786D73的指针的设备[0]。该地址几乎肯定不会在此过程中有效。当对printf()的调用尝试取消引用此无效指针时,OS会触发分段错误并转储核心。
问题在于OP在初始化时错误地将设备变量视为字符串(char数组)。它实际上是一个指针到char的数组,而printf()正在解释它。