在 C 中动态分配和释放


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后使用 callocmemset 以获得确定的值。

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

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

heap = calloc(100, 1);

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

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

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

相关内容

  • 没有找到相关文章

最新更新