堆栈转储访问malloc char数组

时间:2010-05-12 08:54:36

标签: c memory-management stack-dump

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);
}

6 个答案:

答案 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()正在解释它。