为什么 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* fp
和Foo* mp
都是指针类型,因此也是POD types. So, in the default initialization(第Foo f1;
行),都不应初始化。但是结果似乎表明 FILE* fp
是零初始化的。怎么会? FILE*
是编译器喜欢(零)初始化但拒绝零初始化其他指针的特殊指针类型吗?
你没有初始化指针。它们获得随机(未定义)值(具体来说,在 main
被调用之前,运行时在初始化期间碰巧留在堆栈上的任何值)。有时这些值恰好是 NULL
。 C++ 没有初始化它们,你只是“幸运”。正如你的问题的评论中所指出的,在不同的编译器上,或者使用不同的变量声明顺序,FILE*
通常以非 NULL
结束,因为它没有被初始化,只是继承已经发生的任何事情在堆栈上。
考虑
#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* fp
和Foo* mp
都是指针类型,因此也是POD types. So, in the default initialization(第Foo f1;
行),都不应初始化。但是结果似乎表明 FILE* fp
是零初始化的。怎么会? FILE*
是编译器喜欢(零)初始化但拒绝零初始化其他指针的特殊指针类型吗?
你没有初始化指针。它们获得随机(未定义)值(具体来说,在 main
被调用之前,运行时在初始化期间碰巧留在堆栈上的任何值)。有时这些值恰好是 NULL
。 C++ 没有初始化它们,你只是“幸运”。正如你的问题的评论中所指出的,在不同的编译器上,或者使用不同的变量声明顺序,FILE*
通常以非 NULL
结束,因为它没有被初始化,只是继承已经发生的任何事情在堆栈上。