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

C - function returning a pointer to a local variable

考虑以下代码。

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

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

可能,只是可能在你的环境和你的代码中,分配给局部变量的内存位置不是由 OS 回收,并且仍然 可访问 ,但不能保证它在任何其他平台上都会有相同的行为。

每次您调用 abc 它 "marks" 堆栈顶部的一个区域作为写入所有局部变量的地方。它通过移动指示堆栈顶部位置的指针来实现。该区域称为堆栈帧。当函数 returns 时,它通过将堆栈指针移动到原来的位置来表示它不想再使用该区域。因此,如果您之后调用其他函数,它们将出于自己的目的重用堆栈的该区域。但就您而言,您还没有调用任何其他函数。所以堆栈的那个区域保持相同的状态。

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