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