Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
2d字符数组中的C指针问题_C_Arrays_Pointers_Char_2d - Fatal编程技术网

2d字符数组中的C指针问题

2d字符数组中的C指针问题,c,arrays,pointers,char,2d,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 temps只是一个指向char*的指针,但它没有初始的、合理的值temps[0]相当于*(temps+0),但不能取消对垃

为什么这样做有效:

    //split returns (char**)
    char *temp2;
    temp2=split(array[i],'=')[1];
但这并不是:

char **temps;
temps[0]=temp2; //crashes
或者这个:

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

temps
只是一个指向
char*
的指针,但它没有初始的、合理的值
temps[0]
相当于
*(temps+0)
,但不能取消对垃圾值的引用--首先必须将
temps
点设置为有用的位置,例如为其分配内存

如果要使用自动存储存储一些
char*
s,请声明一个char指针数组:

char * temps[20];
temps[0] = /*... etc. ...*/

temps
只是一个指向
char*
的指针,但它没有初始的、合理的值
temps[0]
相当于
*(temps+0)
,但不能取消对垃圾值的引用--首先必须将
temps
点设置为有用的位置,例如为其分配内存

如果要使用自动存储存储一些
char*
s,请声明一个char指针数组:

char * temps[20];
temps[0] = /*... etc. ...*/

如果只声明一个指针变量:

char **temps;

它并不是真的指向某个地方。实际上是这样,但这可能是垃圾(内存中的任何地方)。您必须在使用它之前对其进行初始化。尝试为它分配空间。

如果您只是声明一个指针变量:

char **temps;

它并不是真的指向某个地方。实际上是这样,但这可能是垃圾(内存中的任何地方)。您必须在使用它之前对其进行初始化。尝试为其分配空间。

char**temps
从未分配过任何空间。您正在使用
temps[0]
解除对坏内存的引用

char**temps
从未分配任何空间。您正在使用
temps[0]
解除对坏内存的引用

manmalloc()

你必须分配你的内存来获得空间

manmalloc()

char **temps;
temps[0]=temp2; //crashes
你必须分配你的内存来获得空间

char **temps;
temps[0]=temp2; //crashes
指针temps未初始化。取消引用它是一个未定义的操作


指针temps未初始化。取消引用它是一个未定义的操作。

因为TEMP未初始化。这是一个指向随机内存位置的随机值。

因为temp没有初始化。它是指向随机内存位置的随机值。

Split返回指向字符指针的指针。因此,从
split(array[i],'=')[1]
返回的是一个指向char的指针,char是您在堆栈上声明的,因此为它保留了空间。这就是它起作用的原因

其他两个不起作用,因为指向的空间未分配。您应该使用malloc()。

Split返回指向字符指针的指针。因此,从
split(array[i],'=')[1]
返回的是一个指向char的指针,char是您在堆栈上声明的,因此为它保留了空间。这就是它起作用的原因

其他两个不起作用,因为指向的空间未分配。您应该使用malloc()。

这样想:

char *temp2 = "foo";

char **temps;

temps[0] = temp2; // won't work
temps = &temp2; // ok
temp2指向C字符串。您可以将temp指向temp2的地址(&temp2),但不能解除对temp的引用(即temps[0]),除非您首先使其指向有效的内容。从你的问题来看,听起来你想先对char*数组进行malloc()运算

在第二种和第三种情况下,您在不首先使temp[0]引用某个有效内存位置的情况下解除对temp[0]的引用。正如已经指出的,temps指向一个垃圾位置

您的第一个案例之所以有效,是因为您取消了对split()的引用,所以它给了您一个char*

请这样想:

char *temp2 = "foo";

char **temps;

temps[0] = temp2; // won't work
temps = &temp2; // ok
temp2指向C字符串。您可以将temp指向temp2的地址(&temp2),但不能解除对temp的引用(即temps[0]),除非您首先使其指向有效的内容。从你的问题来看,听起来你想先对char*数组进行malloc()运算

在第二种和第三种情况下,您在不首先使temp[0]引用某个有效内存位置的情况下解除对temp[0]的引用。正如已经指出的,temps指向一个垃圾位置


您的第一个案例有效,因为您正在取消对split()的引用,所以它会给您一个char*

哇,57秒内有6个答案。哇,57秒内有6个答案。