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
所隐含并由编译器强制执行的契约是,表达式
不会以任何方式改变形状或形式。正如欧内斯特所说,试图使用文档来规避语言规范无疑是一件非常糟糕的事情。