请考虑以下代码。
#include<stdio.h>
int *abc(); // this function returns a pointer of type int
int main()
{
int *ptr;
ptr = abc();
printf("%d", *ptr);
return 0;
}
int *abc()
{
int i = 45500, *p;
p = &i;
return p;
}
输出:
45500
根据link我知道这种行为是未定义的。但是为什么每次运行程序时我都能获得正确的值。
答案 0 :(得分:3)
每次调用abc
时,它都会“标记”堆栈顶部的区域,作为写入其所有局部变量的位置。它通过移动指示堆栈顶部位置的指针来实现。该区域称为堆栈帧。当函数返回时,它表示它不想再通过将堆栈指针移动到最初的位置来使用该区域。因此,如果您之后调用其他函数,它们将为了自己的目的重用堆栈的该区域。但在你的情况下,你尚未调用任何其他功能。所以堆栈的区域保持相同的状态。
以上所有内容都解释了代码的行为。并非所有C编译器都以这种方式实现功能,因此您不应该依赖该行为。
答案 1 :(得分:2)
嗯,未定义的行为是未定义的。您永远不能依赖 UB(或调用UB的程序的输出)。
也许,只是在您的环境中以及您的代码,OS为回收分配给本地变量的内存位置仍然可访问,但无法保证它对任何其他平台都具有相同的行为。