我有一个char **
的函数;它在内部使用它来维持连续调用之间的上下文。
定义char **x
和将x
传递给它,定义char *x
并传递&x
之间有什么区别?
对于上下文:我在阅读源代码之前尝试在strtok
手册页上自己实现该示例。我得到了段错误。然后在尝试之后我查看了源。
问题在于我定义了char **x
并将x
作为**saveptr
参数传递,但将定义更改为char *x
并传递给&x
已解决问题。
究竟是什么问题?
答案 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
,则可以修改它(更改其指向地址)。