const char*和free()

const char*和free(),c,memory-management,free,character-arrays,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(

给出下一个代码示例,我无法释放参数
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;
}
在返回此函数之前,我尝试释放expression参数中的数据,但似乎无法释放它。
我想这可能是因为它是一个常量,但我知道C中的字符数组应该始终是常量

我收到的错误消息是在带有
free(expression)
的行中,消息是:
应为void*,但参数的类型为const char*-编译器错误


如何丢弃数据
表达式
包含的内存?

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


最常见的约定是,无论代码分配什么数据,都应该释放数据。释放该参数真的不是你的例程的责任,因为它无法知道这样做是否合法。

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


此外,您不应该将
表达式
设为
常量char*
,因为正如您所看到的,这不匹配<但是,code>char*
应该没问题。

直接回答这个问题是
自由((void*)表达式
这应该足以解决编译错误。

但是,正如其他人所说,您应该让谁调用您的函数来管理内存

什么是“不工作”?编译器错误?运行时错误?从用户鼻子里冒出来的守护进程?您所说的“似乎不工作”和“无法释放”是什么意思?释放(表达式);应为void*但参数的类型为const char*Freeing且非malloc'd、realloc'd或calloc'd指针是未定义的行为。您尝试释放
表达式,但如果已在堆栈上分配,或字符串文字会怎么样?您应该让调用者决定如何处理它。如果它是函数定义(对应于它的文档)提出的“契约”的一部分,那么就可以了。但是调用者应该知道它,并且应该有很好的文档记录,甚至可能在函数名本身中有一个提示。@glglgl一般来说,我有点同意。问题在于,在这种情况下,
const
所隐含并由编译器强制执行的契约是,
表达式
不会以任何方式改变形状或形式。正如欧内斯特所说,试图使用文档来规避语言规范无疑是一件非常糟糕的事情。