如何在C语言中释放作为函数参数传递的字符数组

3
我遇到了一个问题,我不确定是否是问题。我有一个简单的C函数,从字符串中传递char*:



 #include &ltstdio.h>
 #include &ltstdlib.h>
int main(int argc, char** argv) {
passString("hello");
return (EXIT_SUCCESS); }
void passString(char * string) { // .... 一些代码 .... free(string); // ??? }

我被教导要释放我不再使用的每个内存块(主要是数组)。所以我的想法是释放string,但即使在这个简单的例子中程序也会冻结或崩溃。我不确定我是否真的需要在这里释放string,如果需要,我应该如何做到这一点?


@Kos:错误,字符串字面值的类型是char[N],其中N足够大以容纳字符串字面值中的所有字符和零终止符。 "foobar"的类型是char[7]。我相信其他语言(即C ++)也有区别。 - pmg
哎呀,你说得完全正确。我实际上是想说“请使用const char*来引用字符串字面值”。 - Kos
@Kos:在 C++ 中,仅使用 char * 表示字符串字面量已被弃用,但在 C 中并未被弃用。然而,在 C 和 C++ 中修改字符串字面量都是未定义行为。 - Alok Save
是的,我指的是推荐而不是弃用。C 可能没有 C++ 那么类型安全,但保持良好的实践并没有坏处。 - Kos
3个回答

8
您不需要释放使用malloc未分配的内存。在您的示例中,string没有在程序中由malloc分配,因此您不需要释放它。string是一个字符串文字,分配在只读内存中(实现定义),并自动释放。
对于标准爱好者:
参考资料: c99标准:7.20.3.2 free函数

概述
#include
void free(void *ptr);

描述
free函数导致指向ptr的空间被释放,即可用于进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果参数与先前由callocmallocrealloc函数返回的指针不匹配,或者该空间已被调用freerealloc释放,则行为未定义

返回值
free函数没有返回值。


2
你只需要释放你通过动态分配的方式获取的内存(在C中通过malloc,在C++中通过关键词new)。基本上,对于任何类似 malloc() 的分配调用,都应该有一个相应的 free() 调用。

字符串文字不是动态分配的,你不需要担心它们。


2
您正在释放的字符串是静态分配的,可以说是“在编译期间”完成的。实际上,任何字符串字面量(例如"hello")都是这样完成的。您无法释放静态分配的内存,因为它不在堆中。
一般来说,最好在分配点处释放内存。在这种情况下,如果您要动态分配空间给"hello",您应该这样做:
int main(int argc, char** argv) {
    char *s = strdup("hello");
    passString(s);
    free(s);
    return (EXIT_SUCCESS);
}

void passString(char * string) {
    // .... some code ....
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接