2011-11-27 47 views
1

我遇到了一个问题,我不确定它是否是一个问题。我有一个简单的C funcion即会从字符串传递像这样一个char *:如何释放字符数组作为函数参数传入C



#include &ltstdio.h> 
#include &ltstdlib.h> 

int main(int argc, char** argv) { 

    passString("hello"); 

    return (EXIT_SUCCESS); 
} 

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

,我被教导要自由,我不是用了(主要是阵列)的每一次内存块。所以我的想法也是释放字符串,但即使是这个简单的例子,程序也会冻结或崩溃。我不确定我是否真的需要在这里释放字符串,如果是这样,我该如何实现?

+0

@Kos:错误的,字符串文字的类型是'char [N]',其中'N'只是足够大的字符串文字中的所有字符和零终止符。 “foobar”的类型是'char [7]'。我相信其他语言(即C++)有所不同。 – pmg

+0

哎呀......你完全正确。我的意思是“请使用const char *来引用字符串文字”。 – Kos

+0

@Kos:只使用'char *'作为字符串字面值仅在C++中不推荐使用C语言。但是,修改字符串文本是在c和C++中都是UB。 –

回答

5

你不需要free内存,你没有与malloc分配。

在您的示例中,string未在您的程序中由malloc分配,因此您无需将其释放。 string是一个字符串文字,在只读存储器(实现定义)中的某处分配并自动释放。

对于standerdese球迷:

参考文献:
C99标准:7.20.3.2的free功能

梗概
的#include
无空隙(void *的PTR);

描述:
free功能使空间ptr指向被解除分配,即,由 可用于进一步的分配。如果ptr是空指针,则不会发生任何操作。 否则,如果 参数不匹配由callocmalloc,或 realloc功能早些时候返回一个指针,或者如果空间已释放通过调用freerealloc, 的行为定义理解过程网络。

返回
free函数返回值。

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 .... 
} 
1

你只需要释放你(在C或通过在C++中的关键字通过新的malloc)动态分配的。基本上,对于像malloc()这样的分配呼叫,应该有一个free()的地方。

字符串文字不会动态分配,您不需要关心它们。

相关问题