我在编译器中遇到警告:"地址永远不会为NULL"
代码如下:
struct mydata * var = NULL;
/* some function which may modify var*/
if(NULL != &var) {
// do something
}
实际警告(-Werror已标记):
error: the comparison will always evaluate as 'true' for the address of 'var' will never be NULL [-Werror=address]
这是否意味着局部变量的地址始终为非NULL?将它与&var
进行比较是一个错字。
答案 0 :(得分:8)
如果您使用它,它将始终具有有效地址。
如果您不使用它,它可能会被编译器优化或忽略。所以这个地址没有价值,但你永远不会知道。
答案 1 :(得分:1)
C 2011第6.3.2.3节第3段
值为
0
的整型常量表达式,或者类型为void *
的表达式,称为空指针常量。如果将空指针常量转换为指针类型,则保证将结果指针(称为空指针)与不等于指向任何对象或函数的指针进行比较。C 2011脚注66
宏
NULL
在<stddef.h>
(和其他标头)中定义为空指针常量
因此,空指针永远不会指向有效对象。