C - 返回局部指针与局部变量

C - Returning a local pointer vs local variable

我的问题是关于这两个案例:

#include <stdio.h>
int *foo1();
int *foo2();

int main()
{
   printf("so it's %d\n",*foo1());
   printf("so it's %d\n",*foo2());
}

int *foo1()
{
   int i1 = 5;
   return &i1;
}

int *foo2()
{
   int i2 = 5;
   int *p = NULL;
   p = &i2;
   return p;
}

case1: 当它是 foo1() 的情况时,我们得到一个错误,因为我们正试图 return 一个地址的副本到 main,其数据已经已删除(当我们退出 foo1() 函数时)

case2: 但是在 foo2() 中,它 不会给出错误 尽管我们正在 return复制到一个局部变量的指针,在我们退出foo2()函数后,其数据将被删除,为什么会这样?

TL;DR:为什么 foo2() 不报错而 foo1() 报错?

TIA。

函数 foo1foo2 的行为在 C 和 C++ 中都是 未定义

您不能取消引用 一个指向具有自动存储持续时间的变量的指针,该变量不再在范围内。

明天,foo2() 可能也会给你一个错误。或者编译器可能会吃掉你的猫。

在这两种情况下,您都是通过返回指向局部变量的指针并取消引用它来调用 undefined behavior

调用未定义的行为并不意味着你总是会崩溃。这意味着程序的行为是未定义的。它可能会崩溃,可能会输出奇怪的结果,或者看起来工作正常。如您所见,此行为在您的程序中以其中两种方式表现出来。

进行看似无关的更改,例如添加未使用的局部变量或用于调试的 printf,可以改变未定义行为的表现方式。

两者都是未定义的行为,您不能依赖编译器为您发出未定义行为的警告。

您实际上在两个函数中执行相同的操作,实际上这两个函数可能会生成相同的汇编代码。

case1 和 case2 的行为都是未定义的,你不能return指向局部变量的指针