我正在努力学习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行(printf在newp函数中),那么我得到这个:
**p = b
result = 1
*p = b
c = a
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
您正在处理未定义的行为.变量d是本地的(驻留在堆栈上),并且在封闭的function(newp)返回后不可用.
在p外部解除引用时newp,堆栈上的地址&d可能会被其他一些局部变量覆盖,或者它可能包含垃圾.