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

时间:2016-09-07 15:09:43

标签: c undefined-behavior

请考虑以下代码。

#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我知道这种行为是未定义的。但是为什么每次运行程序时我都能获得正确的值。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

也许,只是在您的环境中以及您的代码,OS为回收分配给本地变量的内存位置仍然可访问,但无法保证它对任何其他平台都具有相同的行为。