5

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 */

我在想这应该创建一个像这样的字符数组。

devices[0]
devices[1]
devices[2]
devices[4]
etc

每个元素我都可以存储我的字符串。

非常感谢您的任何建议,

==添加更正===

for(i = 0; i < 10; i++)
{
    devices[i] = malloc(strlen("smxxxx1")+1);
}
4

6 回答 6

5

您已为指针数组分配内存。您需要为每个元素分配内存来存储字符串

例如

#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 );
}
于 2010-05-12T08:59:52.793 回答
4

devices[0] 是 a char *,但您没有为它分配任何存储空间。改为这样做:

char **devices;
devices = malloc(10 * sizeof(char*));

devices[0] = strdup("smxxxx1");

printf("[ %s ]\n", devices[0]);

最终,您必须释放分配的内存strdup()

free(devices[0]);
于 2010-05-12T08:59:55.553 回答
3

您已分配内存来存储 10 个字符指针。要将字符串存储在这些内存位置,您必须为每个位置分配内存。device[0] = malloc(stringLen + 1);基本上,每个指针都需要类似的东西。

于 2010-05-12T08:59:46.383 回答
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 */
于 2010-05-12T08:59:27.270 回答
1

您已为指针(设备)分配空间,但尚未为要存储的字符串分配空间。

于 2010-05-12T08:58:28.987 回答
0

devices 是一个指针数组。当您想要将元素 0 设置为指向该字符串时,您正在将字符串“smxxxx1”复制到数组上。

而不是 strcpy() 尝试:

devices[0] = "smxxxx1"

或者

devices[0] = strdup("smxxxx1")

编辑:

在 32 位系统上,devices[0] 由四个字节组成。这四个字节被字符串“smxxxx1”的前四个字符的字节值覆盖。在ascii中,这些是 0x73、0x6D、0x78、0x78。假设little-endian寻址,您最终会得到包含指向地址 0x78786D73 的指针的 devices[0]。这个地址几乎肯定在这个过程中是无效的。当对 printf() 的调用尝试取消引用此无效指针时,操作系统会触发分段错误并转储核心。

问题是 OP 在初始化时错误地将设备变量视为字符串(char 数组)。它实际上是一个指向 char 的指针数组,而 printf() 就是这样解释它的。

于 2010-05-12T09:02:34.880 回答