为什么 FILE* 指针在 C++ 的默认初始化中被零初始化?

Why is a FILE* pointer zero-initialized in C++'s default initialization?

考虑

#include <iostream>
#include <cstdio>

using namespace std;

struct Foo {
    FILE* fp;
    Foo* mp;
};

int main()
{
    Foo f1;   // default initialization
    cout << f1.fp << '\t' << f1.mp << '\n';

    Foo f2{}; // zero initialization / direct-list-initialization
    //Foo f2 = {}; // zero initialization / copy-list-initialization
    cout << f2.fp << '\t' << f2.mp << '\n';

    FILE* fp; // local POD variable, undefined
    cout << fp << '\n';
}

编译执行,

g++ tp.cc && ./a.out

给出类似的东西:

0       0x5639eb8f00c0
0       0
0x5639eb8f02f0

FILE* fpFoo* mp都是指针类型,因此也是POD types. So, in the default initialization(第Foo f1;行),都不应初始化。但是结果似乎表明 FILE* fp 是零初始化的。怎么会? FILE* 是编译器喜欢(零)初始化但拒绝零初始化其他指针的特殊指针类型吗?

你没有初始化指针。它们获得随机(未定义)值(具体来说,在 main 被调用之前,运行时在初始化期间碰巧留在堆栈上的任何值)。有时这些值恰好是 NULL。 C++ 没有初始化它们,你只是“幸运”。正如你的问题的评论中所指出的,在不同的编译器上,或者使用不同的变量声明顺序,FILE* 通常以非 NULL 结束,因为它没有被初始化,只是继承已经发生的任何事情在堆栈上。