【问题标题】:Difference between passing “pointer to pointer” and “address of pointer” to a function将“指向指针的指针”和“指针的地址”传递给函数之间的区别
【发布时间】:2018-04-05 22:06:31
【问题描述】:

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

定义char **x并将x传递给它与定义char *x并传递&x有什么区别?


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

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

到底是什么问题?

【问题讨论】:

    标签: c pointers segmentation-fault strtok addressof


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这取决于x 指向的位置。如果你写char** x = &ptr_char,然后将x传递给函数,你可以将ptr_char指向*x = new_address
      【解决方案3】:

      当你定义例如

      char **x;
      

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

      另一方面,有这样的定义

      char *x;
      

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

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

      【讨论】:

      • 感谢您的详细解答!我从来没有注意到取消引用未初始化的指针会导致未定义的行为(我认为它只会导致段错误),并且在 C 中模拟了通过引用传递。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多