4、初始化结构体
像数组一样,结构体也可以在定义的时候初始化,方法也几乎一样:
struct Info info = {
20191101,
"Harris",
2019,
4
};
在C99标准中,还支持给指定元素赋值(就像数组一样):
struct Info info = {
.name = "Harris",
.year = 2019
};
对于没有被初始化的成员,则「数值型」成员初始化为0,「字符型」成员初始化为‘\0’。
对齐
下面这个代码,大家来看看会发生什么:
//EXample 02 V1
#include <stdio.h>
int main(void)
{
struct A
{
char a;
int b;
char c;
} a = {'a', 10, 'o'};
printf("size of a = %d\n", sizeof(a));
return 0;
}
我们之前学过,char类型的变量占1字节,int类型的变量占4字节,那么这么一算,一个结构体A型的变量应该就是6字节了。别急,我们看运行结果:
//COnsequence 02 V1
size of a = 12
怎么变成12了呢?标准更新了?老师教错了?都不是。我们把代码改一下:
//EXample 02 V2
#include <stdio.h>
int main(void)
{
struct A
{
char a;
char c;
int b;
} a = {'a', 'o', 10};
printf("size of a = %d\n", sizeof(a));
return 0;
}
结果:
//Consequence 02 V2
size of a = 8
实际上,这是编译器对我们程序的一种优化——内存对齐。在第一个例子中,第一个和第三个成员是char类型是1个字节,而中间的int却有4个字节,为了对齐,两个char也占用了4个字节,于是就是12个字节。
而在第二个例子里面,前两个都是char,最后一个是int,那么前两个可以一起占用4个字节(实际只用2个,第一个例子也同理,只是为了访问速度更快,而不是为了扩展),最后的int占用4字节,合起来就是8个字节。
关于如何声明结构体来节省内存容量,可以阅读下面的这篇文章,作者是艾瑞克·雷蒙,时尚最具争议性的黑客之一,被公认为开源运动的主要领导者之一:
英文原版,中文版 |