在C中动态分配和释放

时间:2012-05-07 12:02:48

标签: c malloc heap free

void* heap = malloc(100);
char *c = heap;
strcpy(c, "Terence");
printf("heap = %s\n", heap);
free(heap);
heap = malloc(100);
printf("heap = %s\n", heap);

输出是:

heap = Terence
heap = 

这就是我的期望,但现在我有一个更复杂的代码,结构与上面的类似,但输出如下:

heap = "Terence"
heap = "  ren  "

类似的东西。

堆似乎还没有被清理干净?

有没有办法解决它?

4 个答案:

答案 0 :(得分:7)

malloc分配的内存区域具有不确定的初始值。

从C标准(强调我的):

  

(c99,7.20.3.3p2)“malloc函数为大小由大小指定的对象分配空间,的值为不确定* 。”

calloc之后使用memsetmalloc来确定值。

答案 1 :(得分:3)

Malloc不会隐式地将已分配的内存清零。为此,您需要为calloc或memset设置单元格:

heap = malloc(100);
memset(heap, 0, 100);

heap = calloc(100, 1);

答案 2 :(得分:0)

释放任何内存块时,应始终将指针变量设置为NULL,因为内存不再可访问。

答案 3 :(得分:0)

使用void free( void* ptr );释放先前分配的内存块时,可以使用指针变量作为自由函数的参数。该函数只读取指针变量,并不会自动将其设置为NULL。

因此,您可以将该变量设置为NULL,以便您编写的其他代码(可能取决于该变量)将处理NULL指针,而不是看起来没问题的内存地址。到不能再访问的内存。