【问题标题】:Treat a void function as a value将 void 函数视为一个值
【发布时间】:2010-04-18 10:37:51
【问题描述】:

我正在编写一些糟糕的、糟糕的代码,我需要一种将 free() 放在语句中间的方法。实际代码是:

int main(){
    return printf("%s", isPalindrome(fgets(malloc(1000), 1000, stdin))?"Yes!\n":"No!\n") >= 0;
    // leak 1000 bytes of memory
}

我正在使用 alloca(),但我不能确定它是否真的可以在我的目标计算机上工作。我的问题是免费返回无效,所以我的代码有这个错误信息:

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);

(调用正在跟踪递归深度)

没有更多的内存泄漏!

【问题讨论】:

  • 对不起。你有什么问题!?
  • 添加另一个函数调用到底有什么问题?如果这是解决问题的最明显方法,而且有效,为什么不呢?
  • 你是对的,这是一个糟糕的主意,为什么要这样做?为什么不在堆栈上使用 char 数组?
  • 我想这取决于人们是否认为对自己的代码施加愚蠢的限制是否合法。 “玩”,我相信这是心理学家所说的 ;-)

标签: c function


【解决方案1】:

我不太清楚你打算把它塞进哪里,但如果你需要一个释放指针 p 作为副作用并计算为 0 的表达式,那么你可以使用它。

(free(p), 0)

【讨论】:

  • 正是我想要的。
【解决方案2】:

可能是逗号运算符?

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;

【讨论】:

    【解决方案3】:

    把它翻过来

    1. isPalindrome 函数中执行 printf

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

    3. Main() 仍然是单行代码 isPalindrome()

    【讨论】:

    • 非常感谢,如果没有这个,我无法做到一行。
    【解决方案4】:

    您可以使用, 运算符链接函数调用,即:

    int main(){
        return printf("%s", isPalindrome(fgets(malloc(1000), 1000, stdin)) ? 
                     (free(p), "Yes!\n") : (free(p), "No!\n")) >= 0;
    }
    

    假设您首先将分配的缓冲区分配给p

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 2019-09-03
      • 2023-01-28
      • 2021-11-19
      • 2020-03-21
      • 1970-01-01
      相关资源
      最近更新 更多