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

Cod*_*ody 5 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

45500

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

red*_*neb 5

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

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

  • 这是*非常*实现特定的。 (6认同)