C指针和指针传递指针

Tim*_*gan 6 c pointers

我正在努力学习C语言,而且我在指针指针上挂了一点.我想我理解你为什么需要它们,但不能完全理解正在发生的事情.

例如,以下代码似乎不像我期望的那样工作:

#include <stdio.h>

int newp(char **p) {
  char d = 'b';
  *p = &d;
  /*printf("**p = %c\n", **p);*/
  return 1;
}

int main() {
  char c = 'a';
  char *p = &c;
  int result;

  result = newp(&p);
  printf("result = %d\n", result);
  printf("*p = %c\n", *p);
  printf("c = %c\n", c);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到的结果是这样的:

result = 1
*p = 
c = a
Run Code Online (Sandbox Code Playgroud)

*p打印为空.相反,我希望*p = b.

但是,如果我取消注释第6行(printfnewp函数中),那么我得到这个:

**p = b
result = 1
*p = b
c = a
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Bla*_*iev 9

您正在处理未定义的行为.变量d是本地的(驻留在堆栈上),并且在封闭的function(newp)返回后不可用.

p外部解除引用时newp,堆栈上的地址&d可能会被其他一些局部变量覆盖,或者它可能包含垃圾.

  • 1)它不是编译器;这是语言规范。2) C 允许对范围进行更细粒度的控制,但这不是真正的问题。问题是 C 默认情况下具有值语义,并希望您进行手动内存管理。(将东西放在堆栈上并让它们在函数结束时消失是一种形式。)“其他动态语言”默认具有引用语义,并保留底层值直到垃圾收集算法启动。 (2认同)

Arm*_*yan 6

您正在存储局部变量(d)的地址,*p然后在变量超出范围时取消引用它.未定义的行为

  • 谢谢 - 现在看起来很明显! (2认同)