为什么我不必在没有malloc()的情况下分配后使用free()

时间:2016-04-09 12:00:43

标签: c pointers memory memory-management dynamic-allocation

当你使用free()时,每个人都知道你必须有malloc()个指针,因为内存是在堆中分配的,而不是由进程负责。

但是为什么在分配没有堆的指针时我不必使用free()

char* text0 = calloc(20, sizeof (char));
strncpy(text0, "Hello World", 20);  // Remember to use `free()`!
char* text1 = "Goodbye World!"; // No need for `free()`?

Isn' t text1还指向堆栈上指向堆上分配的内存的指针?为什么不需要free()?

2 个答案:

答案 0 :(得分:4)

字符串常量"Goodbye World!"在程序启动时放在内存的全局只读部分。在堆上分配 not 。同样适用于"Hello World"

因此,在赋值后,text1指向此静态字符串。由于堆上不存在字符串,因此无需免费调用。

答案 1 :(得分:3)

free必须用于分配有malloc的所有内存。您从堆中分配内存并且必须将其返回,以便稍后再使用它。

char* text0 = calloc(20, sizeof(char));    // this memory must be freed.

在:

text0 = "Hello World";

你过分指向分配的内存的指针。内存现已丢失,无法再次回收/重复使用。

请注意charsizeof(char)周围的括号,并注意我将*放在text0之前,因为您要将常量字符串的地址指定给类型的变量"指向字符"的指针。编译时打开警告!

你应该做的:

free(text0);
text0 = "Hello World";  // DON'T use `free()`!

再次注意我放弃了*。编译时发出警告的更多理由。

char* text1 = "Goodbye World!"; // No need for `free()`?

不,不需要免费调用,因为你没有从堆中分配。