C中的内存分配/释放

时间:2013-08-19 08:58:37

标签: c arrays malloc declaration

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

  1. 我正在做的事情:

    int array[30];      
    

    (即创建一个大小为30的整数数组)与此相同 在做什么?

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

  3. 简而言之,我想知道我何时需要为创建的对象/基元(在函数内部或外部)释放内存。

5 个答案:

答案 0 :(得分:5)

如果你说

int array[30];

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

如果你说

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

内存将在免费商店(堆)上分配,并且您负责释放它

free(array);

无论代码是函数调用内部还是主函数,都同样适用。 如果您使用malloc,则需要使用free

答案 1 :(得分:4)

不,它根本不相同。

第一个使用“自动分配”保留内存,通常在堆栈上。一旦对象超出范围,该内存将自动解除分配,例如在函数返回时。

第二个使用malloc()在堆上分配内存;

时,必须使用free()取消分配此内存。

另外,正确的语法是:

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

你不能在C中使用[]

答案 2 :(得分:0)

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

两种方法都不同,并满足不同的需求。堆栈分配的变量/对象具有有限的范围,而您可以使用超出本地范围的malloc个对象。

使用带有指针的malloc

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

答案 3 :(得分:0)

int array[30]超出范围时,您的数组array将被放入堆栈并且其分配内存将自动释放。但是,当您使用malloc/calloc/realloc分配内存时,您需要明确free此内存。

答案 4 :(得分:0)

基本上malloc在堆中分配内存,在丢失范围后不会被释放。因此,应使用malloc释放使用free分配的内存。