1

我知道在像 c 这样的语言中,我需要在分配内存后释放内存。(我来自java),对此我有几个问题:

  1. 当我在做:

    int array[30];      
    

    (即创建一个大小为 30 个整数的数组)这和做的一样吗?

    int array[] = malloc(sizeof(int)*30);
    
  2. 作为第一个问题的顺序,当我在函数内部创建数组(即函数本地而不是整个文件的全局)时,我是否需要在创建它的函数内部为该数组释放内存? (我看不到任何其他释放它的方法,因为我无法将创建的所有数组的引用传递回 main() 函数)。

所以简而言之,我想确切地知道我什么时候需要为创建的对象/基元(在函数内部或外部)释放内存。

4

5 回答 5

6

如果你说

int array[30];

这是在堆栈上,当它超出范围时会自动为您清理。

如果你说

int * array = (int *)malloc(sizeof(int)*30);

内存将在空闲存储(堆)上分配,您负责释放它

free(array);

无论代码是在函数调用中还是在 main 中,这同样适用。如果使用malloc,则需要使用free

于 2013-08-19T09:03:41.497 回答
5

不,根本不一样。

第一个使用“自动分配”来预留内存,一般在栈上。一旦对象超出范围,该内存将自动释放,例如函数返回时。

第二个用于malloc()“在堆上”分配内存;free()当不再需要时,必须取消分配此内存。

此外,正确的语法是:

int *array = malloc(30 * sizeof *int);

你不能[]在 C中那样使用。

于 2013-08-19T09:04:11.570 回答
0

如果使用int array[30],则在堆栈上分配数组,并且它仅存在于创建它的范围内。如果使用malloc,则必须手动释放内存free

这两种方法是不同的,并且服务于不同的需求。堆栈分配的变量/对象的范围有限,而您可以malloc在本地范围之外使用 'd 对象。

malloc但是,与指针一起使用:

int *array = malloc(sizeof(int)*30);
于 2013-08-19T09:03:58.480 回答
0

您的数组将被放入堆栈,一旦超出范围int array[30],其分配的内存将自动释放。array但是,当您使用分配内存时,malloc/calloc/realloc您需要显式地指定free此内存。

于 2013-08-19T09:04:23.493 回答
0

基本上malloc在堆中分配内存并且在失去作用域后不会被释放。所以分配的内存malloc应该使用free.

于 2013-08-19T09:04:58.263 回答