我正在编写一些可怕的,可怕的代码,我需要一种方法将free()置于语句中间。实际代码是:
int main(){
return printf("%s", isPalindrome(fgets(malloc(1000), 1000, stdin))?"Yes!\n":"No!\n") >= 0;
// leak 1000 bytes of memory
}
我使用的是alloca(),但我无法确定它是否会在我的目标计算机上运行。我的问题是free返回无效,所以我的代码有这个错误信息:
error: void value not ignored as it ought to be
我有一个明显的想法是:
int myfree(char *p){
free(p);
return 0;
}
这很好,因为它使代码更难以阅读,但我不想添加其他功能。
我也曾短暂地尝试将free()
视为函数指针,但我不知道这是否有效,而且我对C的了解不够充分。
注意:我知道这是一个糟糕的主意。不要在家里试试这个孩子。
编辑:非常感谢,我通过将我的单行isPalindrome()
功能改为此来实现它:
return (...)?(calls == 1?free(pLeft),1:1):(calls == 1?free(pLeft),0:0);
(调用跟踪递归深度)
不再有内存泄漏!
答案 0 :(得分:10)
我不知道你要去哪里,但是如果你需要一个释放指针p
作为副作用并且评估为0的表达式,那么你可以使用它。
(free(p), 0)
答案 1 :(得分:3)
可能是逗号运算符吗?
char *buf;
printf("%s", isPalindrome(fgets(buf = malloc(1000), 1000, stdin))? (free(buf), "Yes!\n"):(free(buf), "No!\n") >= 0;
不确定你是否“允许”使用变量。
或者为isPalindrome定义一个包装器,它释放了它的参数:
printf("%s", isPalindrome_free(fgets(buf = malloc(1000), 1000, stdin))? "Yes!\n":"No!\n")) >= 0;
答案 2 :(得分:1)
在 isPalindrome 功能中执行 printf 。
在 isPalindrome 内部,在printf之后调用 free()并从函数返回。
Main()仍为单线 isPalindrome()
答案 3 :(得分:1)
您可以使用,
运算符来链接函数调用,即:
int main(){
return printf("%s", isPalindrome(fgets(malloc(1000), 1000, stdin)) ?
(free(p), "Yes!\n") : (free(p), "No!\n")) >= 0;
}
假设您首先将分配的buffor分配给p
。