2d char数组中C指针的问题

时间:2011-08-16 23:28:08

标签: c arrays pointers char 2d

为什么这样做:

    //split returns (char**)
    char *temp2;
    temp2=split(array[i],'=')[1];

而这不是:

char **temps;
temps[0]=temp2; //crashes

或者这个:

temps[0]=split(array[i],'=')[1]; //crashes

8 个答案:

答案 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 *。