-4
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

4 回答 4

7

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

来自 C 标准(强调我的):

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

使用callocmemset之后malloc具有确定的值。

于 2012-05-07T12:04:54.887 回答
3

Malloc 不会隐式地将分配的内存归零。为此,您需要对 calloc 或 memset 进行单元格:

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

或者

heap = calloc(100, 1);
于 2012-05-07T12:04:53.033 回答
0

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

于 2012-05-07T12:27:10.220 回答
0

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

因此,您可以将该变量设置为 NULL,以便您编写的其他可能依赖于该变量的代码将处理 NULL 指针,而不是看起来正常但指向的内存地址不能再访问了。

于 2012-05-07T16:52:53.960 回答