C – 函数返回指向局部变量的指针

请考虑以下代码。

#include 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

我知道根据链接这种行为是未定义的。 但是为什么每次运行程序时我都能获得正确的值。

每次调用abc它都会“标记”堆栈顶部的区域,作为写入所有局部变量的位置。 它通过移动指示堆栈顶部位置的指针来实现。 该区域称为堆栈帧。 当函数返回时,它表示它不想再通过将堆栈指针移动到最初的位置来使用该区域。 因此,如果您之后调用其他函数,它们将为了自己的目的重用堆栈的该区域。 但在你的情况下,你尚未调用任何其他function。 因此堆栈的区域保持相同的状态。

以上所有内容都解释了代码的行为。 并非所有C编译器都以这种方式实现函数,因此您不应该依赖于该行为

好吧,未定义的行为是未定义的。 您永远不能依赖 UB( 或调用UB的程序的输出 )。

也许, 只是在您的环境和代码中,为本地变量分配的内存位置不会被操作系统回收并仍然可访问 ,但不能保证它对任何其他平台都具有相同的行为。