将“指针指针”和“指针地址”传递给函数

时间:2017-10-25 00:08:20

标签: c pointers segmentation-fault strtok addressof

我有一个char **的函数;它在内部使用它来维持连续调用之间的上下文。

定义char **x和将x传递给它,定义char *x并传递&x之间有什么区别?

对于上下文:我在阅读源代码之前尝试在strtok手册页上自己实现该示例。我得到了段错误。然后在尝试之后我查看了源。

问题在于我定义了char **x并将x作为**saveptr参数传递,但将定义更改为char *x并传递给&x已解决问题。

究竟是什么问题?

3 个答案:

答案 0 :(得分:3)

第一个版本char **x;并传递x,创建并使用指向char的指针的未初始化指针。
第二个版本,char * x;并传递&x,创建一个未初始化的指向char的指针,但传递一个值为char的指针的有效地址,并且是一个定义的值(即像初始化的那样)指向char的未初始化指针。

基本上在第一个版本中,你要求写一个"随机"放在记忆中(几乎可以肯定地获得段错误);第二,你要求写入现有的指针变量。

答案 1 :(得分:1)

定义例如。

char *x;

然后你只需定义一个指针。它是指向另一个指针的指针并不重要,重要的是它只是一个指针。因此,根据上面显示的定义,它没有初始化。它没有任何特殊之处。像你最有可能在功能中取消引用它会导致未定义的行为

另一方面,有一个像

这样的定义
&x

并使用&x获取指向它的指针,x返回的指针指向某个有效的指针,变量&x。取消引用x将允许该功能访问和修改{{1}}本身。

以这种方式使用address-of运算符是一种模拟按引用传递的方法,C没有。

答案 2 :(得分:0)

因为C中的所有函数参数都是按值传递,所以如果定义char **x并传递x,则函数不会修改它。如果您定义char *x并传递&x,则可以修改它(更改其指向地址)。