[英]Why is the pointer giving me this value?
我正在用给定的 output 学习以下问题的测试:
#include <stdio.h>
int main()
{
int i = 10;
int *const p = &i;
foo(&p);
printf("%d\n", *p);
}
void foo(int **p)
{
int j = 11;
*p = &j;
printf("%d\n", **p);
}
Output: 11 11
我知道*p
指向 int i
的地址被传递给了 function foo
。 这里, **p
是一个指向*p
的指针,其中*p
指向int i
。 在 function 中, **p
指针发生变化并指向int j
,调用第一个printf
并打印 11。
我不明白的是第二个printf
function 中的 output。为什么它打印 11,而它应该是 10? 我已经检查过并且int i
的值没有改变,所以不应该取消引用*p
给 10 而不是 11。
有人可以向我解释正在发生的事情背后的逻辑以及为什么会发生吗?
首先,您将 p 分配给 i 的地址,然后将 p 的地址输入到 function foo 中,然后在 foo function 中,p 的值变为 j 中的每个值 (*p = &j)。 当 memory 地址在 foo function 中更改时,您不会将其改回。
注意:变量 p 不是按值传递的,而是通过引用传递给 function。 因此,您对 foo function 中的 p 变量所做的任何更改都会影响主 function 中的 p 变量,因为它们具有相同的 memory 地址
该行:
*p = &j;
使原始变量
int *const p
指向局部变量的地址
int j
调用 foo 后,该局部变量 j 已从堆栈中释放,但 p 仍指向相同的堆栈位置,该位置的值仍然为 11。因此您非法访问已释放的堆栈 memory 但它恰好保留了值为 11。所以它被打印了第二次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.