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

时间:2011-11-27 13:16:40

标签: c arrays character

我遇到了一个问题,我不确定这是否是一个问题。我有一个简单的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); // ???
}

我被教导要释放我不再使用的每个内存块(主要是数组)。所以我虽然也是自由字符串,但程序冻结或崩溃,即使这个简单的例子。我不确定我是否真的需要在这里释放字符串,如果是,我该如何实现呢?

3 个答案:

答案 0 :(得分:6)

您不需要使用free分配的malloc内存。

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

对于standerdese粉丝:

参考文献:
c99标准:7.20.3.2 free功能

  

<强>概要
     #include
  void free(void * ptr);

     

说明
   free函数导致ptr指向的空间被释放,即make   可供进一步分配。如果ptr是空指针,则不执行任何操作。 否则,如果   参数与callocmalloc或之前返回的指针不匹配   realloc功能,或者如果通过调用freerealloc取消分配空间,   行为未定义

     

<强>返回
   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()

字符串文字不是动态分配的,您无需关心它们。