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))代码>