繁体   English   中英

为什么指针给我这个值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM