好的,最近我对这种情况感到惊讶: Evaluating the condition containing unitialized pointer - UB, but can it crash?
似乎是这样:
int *p;
if(p != NULL)
{
int k;
}
理论上已经崩溃了。
我的问题是:何时检查指针的值是否安全?
什么时候检查安全:
if(ptr == SomeValue)
- 这样它不会触发UB?
答案 0 :(得分:6)
检查初始化自动变量的值是唯一安全的。指针也不例外。
这在C.11中的§6.3.2.1¶2中详细说明:
除非它是sizeof运算符的操作数,一元
&
运算符,++
运算符,--
运算符或.
运算符的左操作数或赋值运算符,没有数组类型的左值将转换为存储在指定对象中的值(不再是一个左值);这称为左值转换。 ...如果左值指定了一个自动存储持续时间的对象,该对象可以使用寄存器存储类声明(从未使用过地址),并且该对象未初始化(未使用初始化程序声明在使用之前没有对其进行任何分配),行为未定义。