2017-07-02 79 views
-1

这里有人问了关于||运营商的问题。他想知道为什么(j=3) || (i=3)没有把3分配给我。那个帖子是在这里:Determining the print of C这段代码是否导致内存泄漏?

在我的第一个问题的答案我给这个例子对于如何“功能”可用于:

ptr = malloc(sizeof(*ptr)) || printf("Error\n"); 

是的,我知道它应该被打印到标准错误,但这不是话题。如果我记得正确,我被告知这个构造可能导致内存泄漏。我觉得很难相信,所以请向我解释。

是否有任何特殊原因不使用此构造?除了显而易见的“因为我能”的印象呢?

+7

不要使用它,因为它是一个dilettante的代码。 –

回答

4

如果malloc失败,您不会意识到它;相反,您会将来自printf(打印的字符数)的返回值视为内存地址,导致未定义的行为。

这比内存泄漏更糟糕。

把分配加上括号将解决此问题,总是分配给ptrmalloc结果:

(ptr = malloc(sizeof(*ptr))) || printf("Error\n"); 

但是,你仍然需要确保如果分配失败,以避免使用指针,所以它不会为你节省很多代码。

+0

啊,现在我明白了。所以这就是为什么他把这些额外的括号放在左边的操作数上? – klutt

+0

是;在作业周围放置括号可以解决这个问题。 – SLaks

相关问题