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

为什么不';t在没有malloc()的情况下分配后,我必须使用free(),c,pointers,memory,memory-management,dynamic-allocation,C,Pointers,Memory,Memory Management,Dynamic Allocation,每个人都知道,当您使用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()`? te

每个人都知道,当您使用
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()。它不是在堆上分配的。这同样适用于
“Hello World”


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

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

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

您可以将指针写入分配的内存。内存现在已丢失,无法再次回收/重用

请注意
sizeof(char)
char
周围的括号,并注意,当您将常量字符串的地址分配给“pointer to character”类型的变量时,我将
*
放在
text0
之前。编译时打开警告

你应该做到:

free(text0);
text0 = "Hello World";  // DON'T use `free()`!
请注意,我再次删除了
*
。编译时打开警告的更多原因

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

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

您没有分配内存,因此也没有释放内存。您的代码都不正确。您是否尝试过编译器警告和迂腐模式?确实存在内存泄漏。“text1不是堆栈上指向堆上分配的内存的指针吗?”->否。它是指向静态数据节的指针。您的答案有一些问题
sizeof char
需要参数
*text0=“…”
是错误的,因为
*text0
是一个
char
@Cool Guy,在
sizeof char
周围加括号:这是他的代码,后来我告诉他打开警告。我会把这个加在我的答案上。你的答案仍然令人困惑。你说“你应该这样做:
*text0=“Hello World”
”,但这是错误的,因为
*text0
是一个
字符,你试图给它分配一个毫无意义的字符串文字。@Cool guy,我修正了它。不幸的是,这篇文章越来越长,不再把重点放在他的思维错误上(这就是为什么我有时宁愿把小错误留在文章中的原因)。
char* text1 = "Goodbye World!"; // No need for `free()`?