结构体:
由一系列具有相同类型或不同类型的数据构成的数据集合,属于自定义数据类型
结构体的声明格式:
struct iphone {
//品牌
char name[1024];
//内存
int rom;
//运存
int ram;
//电池
int power;
//价格
int price;
};
由上可见,struct iphone即是自定义的一个手机结构体,如果我们使用它可以采取如下方式:
//方式一:(初始化给值)
struct iphone my = { "huawei", 256, 8, 4000, 8000 };
//方式二:单独赋值
struct iphone your;
memcopy(your.name, "oppo");
your.rom = 16;
your.ram = 2;
your.power = 1500;
your.price = 1000;
那么如果我们想知道他的内存存储是怎样的呢?
接下来将简述结构体内存存储的规则,通过了解规则也能轻松的了解到结构体的内存大小:
//1. 第一个成员在与结构体变量偏移量为0的地址处。
//2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
//3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
//4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
接下能会让人疑惑的是那么每个编译器的默认对齐数该是多少?我们不需要去知道每个编译器的对齐数,去记忆这个很容易出错,而且有的编译器没有设有默认对齐数;所以在我们写代码之前需要添加上一句预编译指令#pragma pack(要设的默认对齐数值);如下:
#pragma pack(8)//设置默认对齐数为
struct iphone {
char name;
//内存
int rom;
//运存
int ram;
//电池
int power;
//价格
int price;
};
那么此时我们来计算一下上面这个结构体的大小为多少?我们结合上面的规则画图表示出来:
红色部分的三个字节即是,int为了对齐,而被浪费掉的空间;
所以这个结构体占据的空间大小应为20;下面我们来测试一下
#pragma pack(8)//设置默认对齐数为8
struct iphone {
char name;
//内存
int rom;
//运存
int ram;
//电池
int power;
//价格
int price;
};
int main()
{
struct iphone your;
printf("%d", sizeof(your));
system("pause");
return 0;
}
运行结果: