Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构字段的默认初始化行为_C++ - Fatal编程技术网

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

C++ 结构字段的默认初始化行为,c++,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 == nul

当这样编写代码时:

#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;
}
#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;
}
但是,如果这样写的话:

#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;
}
#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;
}

这两个版本怎么会有很大的差异呢?

因为。定义局部变量不会初始化它,结构的内容将是不确定的,使用它将导致所述UB。

因为。定义局部变量不会初始化它,结构的内容将是不确定的,使用它将导致上述UB。

我自己找到了答案。非常感谢。皮尔伯格、丹尼尔和普斯坦尼茨。你的回答和评论对我帮助很大

我的困惑来自“C++入门”中的一段。如果其他人也有同样的困惑,我将我的理解写在这里

原文:

在新标准下,我们可以为数据成员提供类内初始值设定项。当我们创建对象时,类内初始值设定项将用于初始化数据成员。没有初始值设定项的成员是默认初始化的(§2.2.1,第43页)。因此,当我们定义Sales_数据对象时,units_Saled和revenue将初始化为0,bookNo将初始化为空字符串

--“C++入门第5版”

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

  • 所有的基元内置类型都没有初始化,它们最初是内存中的随机值
  • 类类型使用其默认构造函数初始化。如果没有默认构造函数,则无法创建包含类类型的结构(需要正确的参数)

  • 我自己找到了答案。非常感谢。皮尔伯格、丹尼尔和普斯坦尼茨。你的回答和评论对我帮助很大

    我的困惑来自“C++入门”中的一段。如果其他人也有同样的困惑,我将我的理解写在这里

    原文:

    在新标准下,我们可以为数据成员提供类内初始值设定项。当我们创建对象时,类内初始值设定项将用于初始化数据成员。没有初始值设定项的成员是默认初始化的(§2.2.1,第43页)。因此,当我们定义Sales_数据对象时,units_Saled和revenue将初始化为0,bookNo将初始化为空字符串

    --“C++入门第5版”

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

  • 所有的基元内置类型都没有初始化,它们最初是内存中的随机值
  • 类类型使用其默认构造函数初始化。如果没有默认构造函数,则无法创建包含类类型的结构(需要正确的参数)

  • 注意:结构所使用的内存有可能在某一点被初始化为零(如果幸运的话,它仍然是)。但这实际上只是运气不好(不好,因为如果你有零初始化内存,你可能不会被这个错误绊倒。但如果你等待足够长的时间,其他人肯定会这样做)如果你希望有零初始化结构,有几种方法可以得到它,例如:
    memset(&a,0,sizeof(ID))注意:结构使用的内存有可能在某一点被初始化为零(如果幸运的话,它仍然是)。但这实际上只是运气不好(不好,因为如果你有零初始化内存,你可能不会被这个错误绊倒。但如果你等待足够长的时间,其他人肯定会这样做)如果你希望有零初始化结构,有几种方法可以得到它,例如:
    memset(&a,0,sizeof(ID))