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 "
类似的东西。
堆似乎还没有被清理干净?
有没有办法解决它?
答案 0 :(得分:7)
由malloc
分配的内存区域具有不确定的初始值。
从C标准(强调我的):
(c99,7.20.3.3p2)“malloc函数为大小由大小指定的对象分配空间,的值为不确定* 。”
在calloc
之后使用memset
或malloc
来确定值。
答案 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指针,而不是看起来没问题的内存地址。到不能再访问的内存。