C语言中的动态分配和释放
输出为:C语言中的动态分配和释放,c,malloc,heap,free,C,Malloc,Heap,Free,输出为: 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 = 差不多吧 堆好像还没清理干净 有办法解决吗?Mallo
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 =
差不多吧
堆好像还没清理干净
有办法解决吗?Malloc不会隐式地将分配的内存归零。为此,您需要将calloc或memset作为单元格:
heap = "Terence"
heap = " ren "
或
malloc
分配的内存区域具有不确定的初始值
根据C标准(重点矿山):
(c99,7.20.3.3p2)“malloc函数为大小由大小指定且值不确定的对象分配空间*”
在
malloc
之后使用calloc
或memset
来确定值。释放任何内存块时,应始终将指针变量设置为NULL
,因为内存不再可访问。使用void free(void*ptr)时
要释放先前分配的内存块,可以使用指针变量作为free函数的参数。该函数只读取指针变量,不会自动将其设置为NULL
因此,由您将该变量设置为NULL,以便您编写的其他代码(可能取决于该变量)将处理NULL指针,而不是看起来正常但指向无法再访问的内存的内存地址。或者,对于字符串缓冲区,只需将第一个字节设置为零即可。
heap = malloc(100);
memset(heap, 0, 100);
heap = calloc(100, 1);