gpt4 book ai didi

c - 为什么输出是 "20 10"而不是垃圾值(悬挂指针)?

转载 作者:太空宇宙 更新时间:2023-11-04 06:59:29 24 4
gpt4 key购买 nike

据我所知,变量“q”和地址在函数 fun() 结束后超出范围。那么,为什么代码的输出是“20 10”?

int *p2;
void fun(int *ptr)
{
int q=10;
ptr=&q;
p2 = ptr;
}

int main()
{
int r=20;
int *p = &r;
fun(p);
printf("%d %d",*p,*p2);
return 0;
}

最佳答案

正如其他人提到的,保存局部变量的地址然后在函数返回后尝试取消引用该地址是 undefined behavior .

这意味着您的程序可能会崩溃,可能会表现出奇怪的行为,或者看起来可以正常工作。对于相同的代码或存在看似无关的更改,此行为不需要从一个编译器到下一个编译器保持一致。

也就是说,许多编译器通常不会在函数返回后修改函数使用的堆栈部分。这是通常不需要的额外工作。所以在 fun 返回后,它所拥有的局部变量仍然包含它们的旧值。

在调用 printf 时,指针 p2 在调用 printf 之前被取消引用。由于在此之前没有调用其他函数,因此上次调用 fun 的 a 值尚未被覆盖。因此,您读取了旧值。

如果您在调用 printf 之前调用其他函数,之前由 q 占用的内存位置将被覆盖,因此您可能会看到其他一些值。

但是,重申一下,这是未定义的行为。并非所有编译器都需要以这种方式运行。例如,在高安全性环境中,编译器可能会在函数返回后清除堆栈内存,从而无法恢复该函数使用的敏感数据。

关于c - 为什么输出是 "20 10"而不是垃圾值(悬挂指针)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40347841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com