我写了一个函数f()来返回指向main函数的本地指针。 我知道f()函数的内存将在执行后释放。但是f()函数可以返回指向a [2]数组的指针。我认为应该发布[2],但它仍然存在。
所以我想知道我可以写一个函数,它可以返回本地指针,本地指针指向函数中的局部变量吗? 如果它可以返回,为什么在f()函数结束后不会释放[2]的数组?
#include <stdio.h>
int* f()
{
int a[2] = {1, 2};
int* p = a;
printf("%p\n", p);
return p;
}
int main(void)
{
int* p = f();
printf("%p\n", p);
return 0;
}
答案 0 :(得分:8)
由于您指向的数组将超出范围并且不再存在,因此尝试取消引用返回的指针将导致undefined behavior。
然而,实际上内存仍然存在,如果以后的函数调用都没有覆盖任何内容,它仍然会保持不变。因此,如果您尝试取消引用指针,您仍将看到数据。但是你 不应该这样做!
关于你在做什么,你实际上并没有取消引用指针,所以你不有UB。你所要做的就是打印指针本身的值。
答案 1 :(得分:2)
是的,你可以(不幸的是)返回指针。不,这不是一个好主意。指针将指向标记为不再使用的内存,这意味着如果您尝试取消引用它,则很可能会出现段错误。也就是说,如果你很幸运,你会得到一个段错误 - 如果不幸,你会得到一个随机值或其他一些未定义的行为。