关于局部变量的意外输出

Unexpected output regarding local variable

我在函数 foo() 中创建了一个局部变量 b。这个函数returns变量的地址b。由于 b 是函数 foo() 的局部变量,变量的地址不应该在函数 foo() 执行完成时存在。我收到以下警告消息:

C:\Users\User\Documents\C codes\fun.c||In function 'foo':
C:\Users\User\Documents\C codes\fun.c|6|warning: function returns address of local variable [-Wreturn-local-addr]|

但是main()函数的指针ptr成功接收到b的地址并打印出来。据我对stack的了解,程序returns对main()函数的控制后,局部变量b的地址应该不复存在了。但输出证明并非如此。

#include<stdio.h>

int* foo()
{
    int b = 8;
    return &b;
}

int main()
{
    int *ptr;
    ptr = foo();
    
    printf("b = %d", *ptr);
    
    
    return 0;
}

输出:

b = 8

对象的生命周期 是程序执行期间为其保留存储(内存)的部分。

当我们说一个对象不再存在于 C 模型中时,我们的意思是保留结束。内存不再为对象保留。这只是一个簿记操作;内存可能会或可能不会用于其他目的。保留结束这一事实并不意味着任何强制执行您不得使用内存的规则。

当你在一个对象的内存预留结束后使用它会发生什么,就像你侵入现实世界时会发生什么。也许没有人注意到,而您却侥幸逃脱。也许有人注意到并阻止了你。也许有人改变了那里的东西,也许他们没有。

在您测试的情况下,b 所在的内存没有任何变化,并且您使用了不再为 b 保留的内存。但是你不能依赖这个;没有规则说它永远有效。