我有一个函数,它接受字符串指针的指针foo(char **str)
我写的时候:
//this code makes error-Segmentation fault (core dumped)
char x[2];
x[0] = 'a';
x[1] = '\0';
foo(&x);
但是当我写
时char x[2];
x[0] = 'a';
x[1] = '\0';
char *a = x;
foo(&a); //code works perfectly
有谁可以解释这两个代码片段之间的区别是什么?
答案 0 :(得分:4)
在此函数调用中
foo(&x);
参数的类型为char ( * )[2]
,它是指向两个元素数组的指针。
在此函数调用中
foo(&a);
参数的类型为char **
,它是指向指针的指针。
因此,正确的调用取决于如何声明相应的函数参数。:)
由于函数参数的类型为char **
,因此第二次调用是正确的。没有从类型char ( * )[2]
到类型char **
的隐式转换,因此编译器将为第一个函数调用发出错误。
这两种类型之间的区别在于,应用于第一个指针的解除引用运算符*会生成类型为char[2]
的数组,而应用于第二个指针的解除引用运算符会再次使用char *
类型的指针。
初学者的困惑在于,对于两个指针,你可以应用下标运算符两次,如ptr[i][j]
,其中ptr
是任一类型的指针,结果看起来类似。