将void函数视为值

时间:2010-04-18 10:37:52

标签: c function

我正在编写一些可怕的,可怕的代码,我需要一种方法将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);

(调用跟踪递归深度)

不再有内存泄漏!

4 个答案:

答案 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)

将其翻出来

  1. isPalindrome 功能中执行 printf

  2. isPalindrome 内部,在printf之后调用 free()并从函数返回。

  3. 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