具有静态存储持续时间的对象中的未初始化指针是初始化为NULL还是全零?

Sim*_*ter 4 c++ standards-compliance language-lawyer

出于好奇,因为我现在没有手头的标准副本:

给定一个实现,其中空指针不是由全零模式表示,具有静态存储持续时间的对象的未初始化指针成员是否会初始化为正确的空指针值,或者是全零值?

更少的标准,更多的代码:

struct foo {
    void *p;
};

foo f;
Run Code Online (Sandbox Code Playgroud)

给定0x00000001的NULL指针表示,我可以期望在main()开头的fp的按位表示?

Oli*_*rth 5

标准说(8.5/4):

零初始化T类型的对象意味着:

- 如果T是标量类型,则将对象设置为值0(零),将其视为整数常量经历,转换为T

- 如果T是非联合类类型,则每个非静态数据成员和每个基类子对象都是零初始化的;

所以f有效地初始化为f = { (void *)0 },我们从4.10/1知道:

空指针常量是整数类型的整数常量表达式rvalue,其值为零.空指针常量可以转换为指针类型; 结果是该类型的空指针值

所以你会得到正确的NULL价值.