2012-05-07 46 views
-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); 

输出为:dynamiclly分配和释放用C

heap = Terence 
heap = 

这就是我的期望,但现在我有一个更为复杂的代码,结构类似于上述情况,但输出是这样的:

heap = "Terence" 
heap = " ren " 

类似的东西。

它似乎堆没有被清理?

有没有办法解决它?

回答

7

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

从C标准(重点煤矿):为一个对象,其大小由大小和其值指定

(C99,7.20.3.3p2)“malloc函数分配空间是不确定* “。

使用callocmallocmemset有一个确定的值。

+0

或者,对于字符串的缓冲区,只需将第一个字节设置为零即可。 –

3

Malloc不会隐式地将分配的内存清零。您需要细胞要么释放calloc或memset的用于此目的:

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

heap = calloc(100, 1); 
0

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

0

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

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