代码编写时:
#include <iostream>
using namespace std;
struct ID {
char *name;
int age;
};
int main() {
ID a;
cout << (long)(a.name) << endl;
cout << a.age << endl;
// cout << (a.name == nullptr) << endl;
return 0;
}
结果是:
0
0
然而,当它写成:
#include <iostream>
using namespace std;
struct ID {
char *name;
int age;
};
int main() {
ID a;
cout << (long)(a.name) << endl;
cout << a.age << endl;
cout << (a.name == nullptr) << endl;
return 0;
}
结果似乎很奇怪:
140735032148552
1545300144
0
这两个版本如何变化很大?
答案 0 :(得分:8)
因为undefined behavior。定义局部变量不会初始化它,结构的内容将是不确定的,使用它将导致所述UB。
答案 1 :(得分:1)
我自己找到了答案。谢谢! Pileborg,Daniel和pstanisz。你的回答和评论对我有很大的帮助。
我的困惑来自“C ++ Primer”中的一段。如果其他人有同样的困惑,我在这里写下我的理解。
原文:
根据新标准,我们可以为数据成员提供类内初始化程序。当我们创建对象时,类内初始值设定项将用于初始化数据成员。没有初始值设定项的成员默认初始化(第2.2.1节,第43页)。因此,当我们定义Sales_data对象时,units_sold和revenue将初始化为0,bookNo将初始化为空字符串。
- “C ++ Primer 5th edition”
我原以为结构中的字段遵循与全局变量相同的默认初始化规则(即初始化为零值)。但它实际上遵循与函数中的局部变量相同的规则,即: