如果我有一个函数返回一个指向字符串的指针,如下所示(可能不同的sytnax),该字符串是否在调用函数foo
结束时从内存中释放?
void foo(){
char *string = function();
// Is string freed at the end of this function?
}
char *function(){
return "string";
}
我问这个问题是因为我明白,如果我要malloc()
内存,它不会在foo
结束时被释放(除非我自己去释放它)。
No。"string"
的内存是在程序执行期间分配的。
C程序的内存可以大致分为…
- 代码。
- 全局变量和静态变量。
- 栈(
char foo[50]
或int i
在一个函数中) - Heap (
malloc
,calloc
,realloc
)
"string"
和42
等常量。常量、全局变量和静态值永远不会被释放。
当函数返回时,堆栈被释放。这就是为什么不应该返回指向堆栈上分配的内存的指针。简单的值,如int
和float
是可以的,因为值是复制的。
// Don't do this, foo will be deallocated on return.
char *function(){
char foo[10];
strcpy(foo, "string");
return foo;
}
// Don't do this either.
char *function(){
char foo = 'f';
return &foo;
}
// Nor this.
int *function(){
int i = 42;
return &i;
}
// But this is fine.
char function(){
char foo = 'f';
return foo;
}
堆只有在free
d时才会被释放。
参见初始化的数据段值在运行前存储在哪里?C程序的内存布局。