我遇到了一个问题,我不确定这是否是一个问题。我有一个简单的C函数,它从字符串传递一个char *,如下所示:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
passString("hello");
return (EXIT_SUCCESS);
}
void passString(char * string) {
// .... some code ....
free(string); // ???
}
我被教导要释放我不再使用的每个内存块(主要是数组)。所以我虽然也是自由字符串,但程序冻结或崩溃,即使这个简单的例子。我不确定我是否真的需要在这里释放字符串,如果是,我该如何实现呢?
答案 0 :(得分:6)
您不需要使用free
分配的malloc
内存。
在您的示例中string
未在您的程序中由malloc
分配,因此您无需释放它。 string
是一个字符串文字,分配在只读内存(实现定义)的某处,并自动释放。
对于standerdese粉丝:
参考文献:
c99标准:7.20.3.2 free
功能
<强>概要强>
#include
void free(void * ptr);说明强>
free
函数导致ptr指向的空间被释放,即make 可供进一步分配。如果ptr是空指针,则不执行任何操作。 否则,如果 参数与calloc
,malloc
或之前返回的指针不匹配realloc
功能,或者如果通过调用free
或realloc
取消分配空间, 行为未定义。<强>返回强>
free
函数不返回任何值。
答案 1 :(得分:1)
您正在释放的字符串是静态分配的,“在编译期间”,如果您愿意的话。实际上,任何字符串文字("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 ....
}
答案 2 :(得分:1)
您只需要释放您动态分配的内容(通过C中的malloc或C ++中的new keyword)。基本上,对于任何分配调用,例如malloc()
,某处应该有一个free()
。
字符串文字不是动态分配的,您无需关心它们。