很多时候我们在使用结构体的时候会纠结如何初始化,
我最常用的一种方法是:结构体 = {0};
下面我们来看一下这样初始化的结果是不是我们想要的。
我希望将结构体中的所有变量全部初始化为0,
包括结构体中的数组和结构体以及时不时被扎得生疼的指针。
因为之前在研究数组初始化的时候发现,直接写数组 = {0};
会把数组中所有的元素都初始化成 0,这是利用了编译器的一个特性:
如果只对数组的一部分进行初始化,则编译器将把其他没有被初始化的元素设置为相应类型的 0。
因此,当只将第一个元素初始化为 0 时,编译器会自动将其他元素设为 0 。
对于复杂结构体类型变量的初始化,同样遵循上述规律,
如果只对结构体的一部分成员变量进行初始化(至少一个),
其他没有初始化的成员变量由编译器完成初始化,为其提供缺省的初始化值。
各种基本数据类型的成员变量初始化缺省值如下:
数据类型 | 缺省初始化值 |
char | "/0x0" |
int | 0 |
float | 0.0 |
double | 0.0 |
int Array[n] | {0,0…,0} |
指针 | 0x0 |
typedef struct test1
{
int test1a;
short test1b[2];
char test1c;
short *test1d;
}Test1;
typedef struct _teststru
{
int struA;
short struB[4];
char struC;
short *struD;
Test1 struE;
}TestStru;
void test(void)
{
TestStru testStru;
TestStru testStru2 = {0};
}
为此我做了如下测试:
在调用test函数的时候打了断点查看内存中的存储情况:
以上是第38行代码结构体 testStru 未初始化的内存情况。
以上是第39行代码结构体 testStru2 使用 testStru2 = {0}; 初始化方法的内存情况。
通过上面的测试可以看到 很明显使用 结构体 = {0}; 这种初始化方式来对结构体进行初始化,是可行的。