标准是否定义空指针常量以将所有位设置为零?

250*_*501 1 c standards language-lawyer

(我引用的是ISO/IEC 9899:201x)

在这里我们看到,整数常量表达式具有整数类型:

6.6常量表达式

6. 整数常量表达式应具有整数类型,并且只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,_Alignof表达式以及作为强制转换的直接操作数的浮点常量.整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为sizeof或_Alignof运算符的操作数的一部分.

这适用于任何整数类型:

6.2.6.2整数类型

5.未指定任何填充位的值.符号位为零的有符号整数类型的有效(非陷阱)对象表示是相应无符号类型的有效对象表示,并且应表示相同的值.对于任何整数类型,所有位为零的对象表示应该是该类型中零值的表示.

然后我们看到使用值为0的整数常量表达式定义空指针常量.

6.3.2.3指针

3. 值为0的整型常量表达式或类型为void*的表达式称为空指针常量.如果将空指针常量转换为指针类型,则保证将结果指针(称为空指针)与指向任何对象或函数的指针进行比较.

因此,空指针常量必须将其所有位设置为零.

但是在线和StackOverflow上有很多答案说这不是真的.

给出引用的部分,我很难相信他们.

(请使用最新标准的参考答案)

oua*_*uah 7

标准是否定义空指针常量以将所有位设置为零?

不,它没有.C标准的任何段落都没有规定这样的要求.

void *p = 0;
Run Code Online (Sandbox Code Playgroud)

p例如,是一个空指针,但标准不要求该对象p必须设置所有位.

有关信息,c-faq网站提到了一些具有非零空指针表示的系统:http://c-faq.com/null/machexamp.html


use*_*733 6

不,NULL 不必全部为零。

N1570 6.3.2.3 指针第 3 段:

值为 0 的整数常量表达式,或转换为 void * 类型的此类表达式,称为空指针常量。66) 如果将空指针常量转换为指针类型,则结果指针(称为空指针)保证与指向任何对象或函数的指针不相等。

见我上面强调:整数0转换,如果有必要,它并不一定有相同的比特演示。

页面底部的注释 66 说:

66)宏NULL在(和其他头文件)中定义为空指针常量;见 7.19。

这将我们引向那一章的一段:

宏是

空值

它扩展为实现定义的空指针常量

更重要的是,在附件 J.3.12(可移植性问题、实现定义的行为、库函数)上说:

— 宏 NULL 扩展到的空指针常量 (7.19)。