将非常量零值整数转换为void*后,结果仍为空指针吗?
空指针判定问题
已知表达式(void *)0被称为空指针,那对于以下代码:
int i = 0; void *s = (void *)i;
变量s是否属于空指针?
根据C语言标准6.3.2.3指针章节的规定:
- 值为0的整数常量表达式、转换为
void*类型的此类表达式,或者预定义常量nullptr被称为空指针常量⁽⁷⁰⁾。若将空指针常量或nullptr_t类型的值(必然是nullptr)转换为指针类型,得到的结果指针称为空指针,保证与任何对象或函数的指针比较都不相等。- 将空指针转换为另一种指针类型会得到该类型的空指针。任意两个空指针比较结果都相等。
- 整数可以转换为任何指针类型。除前文规定的情况外,转换结果由实现定义,可能未正确对齐,可能未指向引用类型的实体,存储到对象中时可能产生不确定的表示⁽⁷¹⁾。
结论
变量s不属于标准定义的空指针。原因在于:i是一个整型变量,并非“值为0的整数常量表达式”,因此(void *)i不属于空指针常量。按照标准第5条的规定,这种转换的结果是实现定义的,不能保证得到的指针满足空指针的特性(比如和所有对象/函数指针比较都不相等)。
内容的提问来源于stack exchange,提问作者wimalopaan
相关产品推荐
相关产品推荐

