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。
函数 foo1
和 foo2
的行为在 C 和 C++ 中都是 未定义。
您不能取消引用 一个指向具有自动存储持续时间的变量的指针,该变量不再在范围内。
明天,foo2()
可能也会给你一个错误。或者编译器可能会吃掉你的猫。
在这两种情况下,您都是通过返回指向局部变量的指针并取消引用它来调用 undefined behavior。
调用未定义的行为并不意味着你总是会崩溃。这意味着程序的行为是未定义的。它可能会崩溃,可能会输出奇怪的结果,或者看起来工作正常。如您所见,此行为在您的程序中以其中两种方式表现出来。
进行看似无关的更改,例如添加未使用的局部变量或用于调试的 printf
,可以改变未定义行为的表现方式。
两者都是未定义的行为,您不能依赖编译器为您发出未定义行为的警告。
您实际上在两个函数中执行相同的操作,实际上这两个函数可能会生成相同的汇编代码。
case1 和 case2 的行为都是未定义的,你不能return指向局部变量的指针
我的问题是关于这两个案例:
#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。
函数 foo1
和 foo2
的行为在 C 和 C++ 中都是 未定义。
您不能取消引用 一个指向具有自动存储持续时间的变量的指针,该变量不再在范围内。
明天,foo2()
可能也会给你一个错误。或者编译器可能会吃掉你的猫。
在这两种情况下,您都是通过返回指向局部变量的指针并取消引用它来调用 undefined behavior。
调用未定义的行为并不意味着你总是会崩溃。这意味着程序的行为是未定义的。它可能会崩溃,可能会输出奇怪的结果,或者看起来工作正常。如您所见,此行为在您的程序中以其中两种方式表现出来。
进行看似无关的更改,例如添加未使用的局部变量或用于调试的 printf
,可以改变未定义行为的表现方式。
两者都是未定义的行为,您不能依赖编译器为您发出未定义行为的警告。
您实际上在两个函数中执行相同的操作,实际上这两个函数可能会生成相同的汇编代码。
case1 和 case2 的行为都是未定义的,你不能return指向局部变量的指针