2

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

char **x定义和传递x给它和定义char *x和传递有什么区别&x


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

问题是我定义char **xx作为**saveptr参数传递,但是将定义更改为char *x和传递&x解决了问题。

究竟是什么问题?

4

3 回答 3

3

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

基本上对于第一个版本,您要求在内存中的“随机”位置写入(几乎可以肯定会得到段错误);其次,您要求写入现有的指针变量。

于 2017-10-25T00:15:58.607 回答
1

当你定义例如

char **x;

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

另一方面,定义如下

char *x;

并使用&x它来获取指向它的指针,该指针由&x指向变量的有效位置返回x。取消引用&x将允许函数访问和修改x自身。

以这种方式使用 address-of 运算符是一种模拟pass by reference的方法,而 C 没有。

于 2017-10-25T00:13:20.603 回答
0

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

于 2017-10-25T00:14:36.060 回答