为什么在没有 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 因为你没有从堆中分配。
每个人都知道在使用 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 因为你没有从堆中分配。