void* heap = malloc(100);
char *c = heap;
strcpy(c, "Terence");
printf("heap = %sn", heap);
free(heap);
heap = malloc(100);
printf("heap = %sn", heap);
输出为:
heap = Terence
heap =
这就是我所期望的,但现在我有一个更复杂的代码,结构类似于上面,但输出是这样的:
heap = "Terence"
heap = " ren "
类似的东西。
似乎堆还没有清理干净?
有没有办法解决它?
malloc
分配的内存区域具有不确定的初始值。
来自 C 标准(强调我的):
(c99, 7.20.3.3p2) "malloc 函数为大小由大小指定且值不确定*的对象分配空间。
在malloc
后使用 calloc
或 memset
以获得确定的值。
Malloc 不会隐式将分配的内存归零。为此,您需要将 calloc 或 memset 单元格化:
heap = malloc(100);
memset(heap, 0, 100);
或
heap = calloc(100, 1);
使用 void free( void* ptr );
释放以前分配的内存块时,可以使用指针变量作为 free 函数的参数。该函数仅读取指针变量,不会自动将其设置为 NULL。
因此,由您来将该变量设置为 NULL,以便您编写的其他代码(可能依赖于该变量)将处理 NULL 指针,而不是看起来正常但指向无法再访问的内存的内存地址。
释放任何内存块时,应始终将指针变量设置为 NULL
,因为内存不再可访问。