结构字段上的默认初始化行为

时间:2015-04-21 11:19:32

标签: c++

代码编写时:

#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

这两个版本如何变化很大?

2 个答案:

答案 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”

我原以为结构中的字段遵循与全局变量相同的默认初始化规则(即初始化为零值)。但它实际上遵循与函数中的局部变量相同的规则,即:

  1. 所有原始内置类型都没有初始化,因此它们最初是在内存中的随机值。
  2. 使用默认构造函数初始化类类型。如果没有默认构造函数,则无法创建包含类类型的结构(需要适当的参数)。