为什么这样做:
//split returns (char**)
char *temp2;
temp2=split(array[i],'=')[1];
而这不是:
char **temps;
temps[0]=temp2; //crashes
或者这个:
temps[0]=split(array[i],'=')[1]; //crashes
答案 0 :(得分:2)
temps
只是指向char*
的指针,但它没有任何初始化,明智的价值! temps[0]
相当于*(temps + 0)
,但您不能取消引用垃圾值 - 首先必须在某个有用的位置temps
点,例如通过为它分配内存。
如果你想用自动存储存储一些char*
,那么请声明一个char指针数组:
char * temps[20];
temps[0] = /*... etc. ...*/
答案 1 :(得分:2)
Split返回指向char 指针的指针。因此,从split(array[i],'=')[1]
返回的是一个指向char 的指针,它是您在堆栈上声明的内容,因此为它保留了空间。这就是它运作的原因。
其他两个不起作用,因为指向的空间未分配。你应该使用malloc()。
答案 2 :(得分:0)
如果你只是声明一个指针变量:
char **temps;
它并没有真正指向某个地方。嗯,它实际上是,但那可能是垃圾(在内存中的任何地方)。您必须在使用之前对其进行初始化。尝试为它分配空间。
答案 3 :(得分:0)
char **temps
从未分配任何空间。您使用temps[0]
取消引用了不良内存。
答案 4 :(得分:0)
man malloc()
你必须分配你的记忆以获得空间!
答案 5 :(得分:0)
char **temps;
temps[0]=temp2; //crashes
指针temps未初始化。取消引用它是一种未定义的操作。
答案 6 :(得分:0)
因为temps未初始化。它是指向随机存储位置的随机值。
答案 7 :(得分:0)
这样想:
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 *。