C语言学了好多年,很多基础理论都不记得了。因为一直都是C#用得多。
后面我在学C++的时候,在初始化结构体时,都习惯了使用C++ 11里的 一致性初始化(Uniform Initialization)
像下面这样
1 struct data 2 { 3 int num1 = 100; 4 int num2 = 200; 5 }
1 data d{};
最近在书上看到的写法是
1 data d = {0};
所以也想搞清楚这些初始化方法的区别是什么。
这里在stackoverflow上搜到一个高赞回答,做个笔记记录一下。
1、data d{}
sets all values to their defaults defined in the struct.(将所有值设置为结构中定义的默认值)
2、data d = {}
also sets all values to their defaults(将所有值设置为结构中定义的默认值)
3、 data d = {0}
sets only the FIRST value to zero, and all other values to their defaults(将第一个值设置为0,其它值为结构中定义的默认值)
可以看到上面 3种常用的写法在初始化时并不能很好地进行清零操作。
所以在进行结构体初始化并清零时,推荐使用以下方法:
1、主动清零
1 // C-style typedef'ed struct 2 typedef struct 3 { 4 int num1 = 100; 5 int num2 = -100; 6 int num3; 7 int num4 = 150; 8 } data_t; 9 10 // EXPLICITLY set every value to what you want! 11 data_t d1 = {0, 0, 0, 0}; 12 // OR (using gcc or C++20 only) 13 data_t d2 = {.num1 = 0, .num2 = 0, .num3 = 0, .num4 = 0};
2、使用 memset()
函数强制设置所有字节数据为0
1 data_t d3; 2 memset(&d3, 0, sizeof(d3));
3、声明结构体时,直接设置默认值为0
1 // C-style typedef'ed struct 2 typedef struct 3 { 4 int num1 = 0; 5 int num2 = 0; 6 int num3 = 0; 7 int num4 = 0; 8 } data_t; 9 10 // Set all values to their defaults, which are zero in 11 // this case 12 data_t d4 = {}; 13 // OR 14 data_t d5{}; // same thing as above in C++ 15 16 // Set the FIRST value only to zero, and all the rest 17 // to their defaults, which are also zero in this case 18 data_t d6 = {0};
4、为结构体增加一个构造函数
1 // 1. Using an initializer list 2 struct data 3 { 4 int num1; 5 int num2; 6 int num3; 7 int num4; 8 9 data() : 10 num1(0), 11 num2(0), 12 num3(0), 13 num4(0) {} 14 }; 15 16 data d7; // all values are zero 17 18 // OR: 2. manually setting the values inside the constructor 19 struct data 20 { 21 int num1; 22 int num2; 23 int num3; 24 int num4; 25 26 data() 27 { 28 num1 = 0; 29 num2 = 0; 30 num3 = 0; 31 num4 = 0; 32 } 33 }; 34 35 data d8; // all values are zero
5、当结构体没有定义默认值时,声明为static
1 typedef struct 2 { 3 int num1; 4 int num2; 5 int num3; 6 int num4; 7 } data_t; 8 9 // `static` forces a default initialization of zero for each 10 // value when no other default values are set 11 static data_t d9;
参考资料:
https://stackoverflow.com/questions/61240589/how-to-initialize-a-struct-to-0-in-c
https://en.cppreference.com/w/cpp/language/zero_initialization