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

Why don't I have to use free() after allocating without malloc()

每个人都知道在使用 malloc() 时必须 free() 指针,因为内存是在堆中分配的,进程不会考虑。

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

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

text1不也是栈上的指针,指向堆上分配的内存吗?为什么不需要 free()?

字符串常量"Goodbye World!" 在程序启动时被放置在内存的全局只读部分。它 not 分配在堆上。 "Hello World" 也是如此。

所以赋值后,text1指向这个静态字符串。由于堆上不存在该字符串,因此无需调用 free。

free 必须用于所有用 malloc 分配的内存。您从堆中分配内存并且必须 return 它以便您以后可以再次使用它。

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

在:

text0 = "Hello World";

您覆盖了指向已分配内存的指针。现在记忆丢失了,不能再reclaimed/reused了。

请注意 sizeof(char)char 周围的括号,并注意我在 text0 之前删除了 *,因为您正在将常量字符串的地址分配给变量类型 "pointer to character"。编译时打开警告!

你应该做的:

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

再次注意我删除了 *。更多理由在编译时打开警告。

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

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