【问题标题】:Problem with C pointers in 2d char arrays二维字符数组中的 C 指针问题
【发布时间】:2011-10-28 12:25:01
【问题描述】:
为什么会这样:
//split returns (char**)
char *temp2;
temp2=split(array[i],'=')[1];
这不是:
char **temps;
temps[0]=temp2; //crashes
或者这个:
temps[0]=split(array[i],'=')[1]; //crashes
【问题讨论】:
标签:
c
arrays
pointers
char
2d
【解决方案1】:
temps 只是一个指向char* 的指针,但它没有初始化的、合理的值! temps[0] 等价于 *(temps + 0),但你不能取消引用垃圾值——你首先必须使 temps 指向有用的地方,例如通过为其分配内存。
如果你想用自动存储来存储一些char*s,然后声明一个字符指针数组来代替:
char * temps[20];
temps[0] = /*... etc. ...*/
【解决方案2】:
Split 返回一个指向一个字符的指针。因此,split(array[i],'=')[1] 返回的是一个 指向 char 的指针,这是您在堆栈上声明的内容,因此为它保留了空间。这就是它起作用的原因。
其他两个不起作用,因为指向的空间没有分配。你应该使用 malloc()。
【解决方案3】:
如果你只是声明一个指针变量:
char **temps;
它并没有真正指向某个地方。嗯,它实际上是,但这可能是垃圾(内存中的任何地方)。您必须在使用它之前对其进行初始化。尝试为其分配空间。
【解决方案4】:
char **temps 从未分配任何空间。您正在使用 temps[0] 解除对坏记忆的引用。
【解决方案5】:
人 malloc()
你必须分配你的内存来获得空间!
【解决方案6】:
char **temps;
temps[0]=temp2; //crashes
指针 temps 未初始化。取消引用它是一个未定义的操作。
【解决方案7】:
因为 temps 没有初始化。它是一个指向随机内存位置的随机值。
【解决方案8】:
这样想:
char *temp2 = "foo";
char **temps;
temps[0] = temp2; // won't work
temps = &temp2; // ok
temp2 指向一个 C 字符串。您可以将 temps 指向 temp2, (&temp2) 的地址,但不能取消引用 temps(即 temps[0]),除非您首先使其指向有效的东西。从您的问题来看,您似乎想先 malloc() 一个 char* 数组。
在第二种和第三种情况下,您取消引用 temps[0] 而不首先使其引用某个有效的内存位置。正如已经指出的那样, temps 指向一个垃圾位置。
您的第一个案例有效,因为您取消了对 split() 的引用,所以它给了您一个 char*。