Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的动态分配和释放_C_Malloc_Heap_Free - Fatal编程技术网

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);