【问题标题】:How to free array of characters passed as function parameter in C如何释放在C中作为函数参数传递的字符数组
【发布时间】:2011-11-27 13:16:39
【问题描述】:

我遇到了一个问题,我不确定这是否是一个问题。我有一个简单的 C 函数,它可以像这样从字符串传递一个 char*:

#include &ltstdio.h&gt #include &ltstdlib.h&gt int main(int argc, char** argv) { passString("hello"); return (EXIT_SUCCESS); } void passString(char * string) { // .... some code .... free(string); // ??? }

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

【问题讨论】:

  • @Kos: 错误,字符串文字的类型是char[N],而N 刚好足够容纳字符串文字中的所有字符和一个零终止符。 "foobar" 的类型是 char[7]。我相信其他语言(即 C++)是有区别的。
  • 哎呀...你完全正确。我实际上的意思是“请使用 const char* 来引用字符串文字”。
  • @Kos: 仅在 C++ 中不推荐将 char * 用于字符串文字,而不是在 C 中。但是,是的,修改字符串文字在 c 和 c++ 中都是 UB。
  • 是的,我指的是推荐,而不是弃用。 C 可能不像 C++ 那样类型安全,但保持良好实践并没有什么坏处。

标签: c arrays character


【解决方案1】:

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

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

对于标准的粉丝:

参考:
c99 标准:7.20.3.2 free 函数

概要
#包括
void free(void *ptr);

说明:
free函数使ptr指向的空间被释放,也就是使 可用于进一步分配。如果 ptr 是空指针,则不会发生任何操作。 否则,如果 该参数与callocmalloc 或之前返回的指针不匹配 realloc 函数,或者如果空间已通过调用 freerealloc 被释放, 行为未定义

退货
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 ....
    }
    

    【讨论】:

      【解决方案3】:

      您只需要释放动态分配的内容(通过 C 中的 malloc 或通过 C++ 中的关键字 new)。基本上,对于像 malloc() 这样的任何分配调用,在某处都应该有一个 free()

      字符串字面量不是动态分配的,您不需要关心它们。

      【讨论】:

        猜你喜欢
        • 2015-11-13
        • 2012-11-15
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多