与char *foo()函数相关的内存释放(在C中)?

  • 本文关键字:释放 内存 char foo 函数 c
  • 更新时间 :
  • 英文 :


如果我有一个函数返回一个指向字符串的指针,如下所示(可能不同的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程序的内存可以大致分为…

  • 代码。
  • "string"42等常量。
  • 全局变量和静态变量。
  • 栈(char foo[50]int i在一个函数中)
  • Heap (malloc,calloc,realloc)

常量、全局变量和静态值永远不会被释放。

当函数返回时,堆栈被释放。这就是为什么不应该返回指向堆栈上分配的内存的指针。简单的值,如intfloat是可以的,因为值是复制的。

// 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;
}

堆只有在freed时才会被释放。

参见初始化的数据段值在运行前存储在哪里?C程序的内存布局。

相关内容

  • 没有找到相关文章

最新更新