我正在编写这样的代码:
#include <stdlib.h>
int main(void)
{
void *kilobyte;
kilobyte = malloc(1024);
kilobyte = NULL, free(kilobyte);
return 0;
}
对称性,这很好。但我以前从未见过其他人使用过这个成语,所以我想知道这可能实际上是不可移植/不安全的,尽管有Wikipedia引用:
在C和C ++编程语言中,逗号运算符(由标记表示)是一个二元运算符,它计算第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型)。
编辑:混淆了订单。现在它在gcc
上编译而没有任何警告。
答案 0 :(得分:11)
通过这样做:
kilobyte = NULL, free(kilobyte);
你有内存泄漏。
您将kilobyte
设置为NULL,因此它指向的任何内存都不再在任何地方引用。然后,当您执行free(kilobyte)
时,您实际上正在执行free(NULL)
而不执行任何操作。
关于free(NULL)
,来自C standard。
7.22.3.3
free
功能1
#include <stdlib.h> void free(void *ptr);
2。
free
函数会导致ptr
指向的空间 取消分配,即可用于进一步分配。 如果ptr
是空指针,不会发生任何操作。否则,如果是参数 与先前由内存返回的指针不匹配 管理功能,或者如果空间已被解除分配 调用free
或realloc
时,行为未定义。
编辑前的原始代码:
kilobyte = free(kilobyte), NULL;
这个问题是=
运算符的优先级高于,
运算符,所以这个语句是有效的:
(kilobyte = free(kilobyte)), NULL;
这会尝试将变量设置为void
,这是不允许的。
你可能要做的就是:
kilobyte = (free(kilobyte), NULL);
这将释放指针,然后将指针设置为NULL。
正如奥拉夫在评论中所提到的,不是一行中做所有事情,而是最好这样做:
free(kilobyte);
kilobyte = NULL;
读者可以更清楚地做到这一点,而不是将代码压缩成其他人可能无法理解的内容,而且(正如您现在所看到的那样)不容易出错。