5

我正在编写这样的代码:

#include <stdlib.h>

int main(void)
{
    void *kilobyte;
    kilobyte = malloc(1024);
    kilobyte = NULL, free(kilobyte);
    return 0;
}

为了对称,这很好。但是我以前从未见过其他人使用这个成语,所以我想知道这是否真的是不可移植/不安全的,尽管维基百科引用了这个:

在 C 和 C++ 编程语言中,逗号运算符(由记号 , 表示)是一个二元运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(和类型)。


编辑:混淆了顺序。现在它编译gcc没有任何警告。

4

1 回答 1

10

通过做这个:

kilobyte = NULL, free(kilobyte);

你有内存泄漏。

您设置kilobyte为 NULL,因此它指向的任何内存都不再在任何地方引用。然后,当您这样做时free(kilobyte),您实际上是在free(NULL)执行不执行任何操作的操作。

关于free(NULL),从C标准

7.22.3.3free功能

1.

#include <stdlib.h>
void free(void *ptr);

2. 该free函数使所指向的空间ptr被释放,即可供进一步分配。 如果 ptr是空指针,则不发生任何动作。否则,如果参数与内存管理函数先前返回的指针不匹配,或者如果空间已通过调用freeor被释放realloc,则行为未定义。

至于编辑前的原始代码:

kilobyte = free(kilobyte), NULL;

这样做的问题是=运算符的优先级高于,运算符,因此此语句有效:

(kilobyte = free(kilobyte)), NULL;

这试图设置一个void不允许的变量。

你可能想要做的是:

kilobyte = (free(kilobyte), NULL);

这将释放指针,然后将指针设置为 NULL。

正如 Olaf 在评论中提到的那样,与其在一行中做所有事情,不如这样做:

free(kilobyte);
kilobyte = NULL;

这样做对读者来说比将代码压缩成其他人可能无法理解的内容更清楚,并且(正如您现在所看到的)更不容易出错。

于 2016-10-02T02:08:40.337 回答