【发布时间】:2018-03-09 18:32:48
【问题描述】:
我写了一个函数 f() 来返回指向主函数的本地指针。 我知道 f() 函数的内存在执行后会被释放。但是 f() 函数可以返回指向 a[2] 数组的指针。我认为 a[2] 应该被释放,但它仍然存在。
所以我想知道我是否可以编写一个可以返回本地指针的函数,并且本地指针指向函数中的局部变量? 如果可以返回,为什么a[2]的数组在f()函数结束后不会被释放?
#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;
}
【问题讨论】:
-
C 没有自己的垃圾收集器,因此在函数退出时变量仍然保留内存,但在函数调用退出时程序无法控制这些变量并且不能保证这些变量不能被其他一些定义或变量声明覆盖。其他一些函数可能会获得与前一个函数分配的相同的堆栈。
-
@GauravPathak 注意:面向对象并不意味着它有垃圾收集器。
-
不能返回本地指针,以后再使用。
-
@Havenard 我同意!但我猜大多数面向对象的语言都有 GC,如果我没记错的话。
-
@GauravPathak:C++ 声称(正确地)具有面向对象的特性,但没有任何 GC。