-1

这里有人问了关于||运营商的问题。他想知道为什么(j=3) || (i=3)不给 i 赋值 3。那篇文章在这里:确定 C 的打印

在我对这个问题的第一个回答中,我举了这个例子来说明如何使用这个“特性”:

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

是的,我知道它应该打印到 stderr,但这不是主题。如果我没记错的话,有人告诉我这个构造可能会导致内存泄漏。我觉得很难相信,所以请给我解释一下。

有什么特别的理由不使用这个结构吗?除了它给人的明显的“因为我可以”的印象之外?

4

1 回答 1

4

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

这比内存泄漏更糟糕。

将括号括在分配周围将解决此问题,方法是始终ptr分配malloc

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

但是,如果分配失败,您仍然需要确保避免使用指针,因此它不会为您节省太多代码。

于 2017-07-02T02:45:59.253 回答