未初始化指针的布尔求值:是true、false还是未定义/实现定义行为?
未初始化指针布尔求值的行为判定
嘿,这个问题抓得很准——很多人容易把未初始化指针和空指针搞混,其实两者的行为天差地别。直接给结论:你示例里的if(p)判断属于未定义行为,原因如下:
- 首先,自动存储期的未初始化变量(比如你代码里的
int *p),它的值是不确定值(indeterminate value),C标准明确规定这类对象如果没有显式初始化,值是完全未知的,甚至可能是陷阱表示(trap representation)。 - 当你在
if条件里写p时,相当于把这个不确定的指针值隐式转换为_Bool类型:转换规则是“值等于0则为false,否则为true”。但问题在于,读取并使用不确定值的行为(除了极个别特殊场景)本身就是未定义行为——如果指针恰好是陷阱表示,读取它的操作直接触发未定义行为;就算不是陷阱表示,它的值可能是任意的,编译器完全可以自由处理这个判断,比如直接优化掉整个分支,或者随机返回true/false,甚至让程序崩溃。
要特别注意和空指针的区别:空指针是有确定语义的(所有空指针转换为_Bool都是false),但未初始化指针不是空指针,它没有任何确定的取值保证。
内容的提问来源于stack exchange,提问作者cmutex
相关产品推荐
相关产品推荐

