const char *和free()

时间:2012-06-15 19:50:31

标签: c memory-management free character-arrays

鉴于下一个代码示例,我无法释放参数const char* expression

// removes whitespace from a characterarray
char* removewhitespace(const char* expression, int length)
{
    int i = 0, j = 0;
    char* filtered;
    filtered = (char*)malloc(sizeof(char) * length);
    while(*(expression + i) != '\0')
    {
        if(!(*(expression + i) == ' '))
        {
            *(filtered + j) = *(expression + i);
            j++;
        }
        i++;
    }
    filtered[j] = '\0';
    free(expression); //this doesn't seem to work
    return filtered;
}

在我返回此函数之前,我尝试释放表达式参数中的数据,但我似乎无法释放它 我认为这可能是因为它是一个常数,但我了解到C中的字符数组总是应该是常量。

我收到的错误消息位于free(expression)的行,消息为:
expected void* but argument is of type const char * - compiler error

如何丢弃数据expression包含的内存?

3 个答案:

答案 0 :(得分:9)

如果它是一个常量,这意味着它不应该被删除,因为它没有被分配:调用者可以很容易地将基于堆栈的数组传递给你的方法,释放它将是坏事

最常见的约定是,无论代码分配某些数据都应释放数据。释放这个论点真的不是你的常规责任,因为它无法知道这是否是合法的事情。

答案 1 :(得分:1)

如果你真的想拥有这样的函数 - 获取堆指针,释放它并尽管返回另一个堆指针 - 你应该很好地记录它。

此外,你不应该expression成为const char*,因为这与你看到的不匹配。但是,char*应该没问题。

答案 2 :(得分:0)

直接向前直接提出的问题是 free((void*)expression); 这应该足以解决编译错误。 但是,因为其他人已经声明你应该让谁调用你的函数来管理内存