c语言之结构体,共用体大小的问题

先来说一下这个最宽基本成员类型,就是你字节对齐的字节数。一般我们计算结构体大小,都是选择默认的对齐字节,当然,我们还可以来指定默认的对齐字节数,设置不同的字节对齐,得出来的结果是不一样的,比如在vs里面我们就可以如下进行设置,文件名右键属性

然后来说计算结构体大小字节对齐计算原则:

        1.结构体总大小是最宽基本成员类型大小的整数倍

        2.当前数据相对于首地址的偏移量必须是当前数据元素大小的整数倍

先来看默认情况怎么计算总大小?

        最后一个数据的地址偏移量 + 最后一个数据的大小

下面就是左边是偏移量,右边是数据大小,->表示数据的变动

#include <stdio.h>
#include <stdlib.h>

//左边代表数据类型相对于首地址的偏移量 右边数据大小
struct A {
	short b1;//0 2
	int num1;//4 4
	float num2;//6->8 4
	double num3;//12->16 8
	char num4[20];//24 20
	short num5;//44 2
	double num6;//42->48 8 => 56
};//56 最宽基本类型是8 ,总大小是它的7倍

struct B {
	int num1;//0 4
	short num2;//4 2
	double num3;//6->8 8
	short num4;//16 2
	int num5;//18->20 4
	int arr1[17];//24 68
	float num6;//92 4
	double arr2[18];//96 144 ==> 240
};//240 是最宽基本类型大小的30倍

struct C {
	int num1;//0 4
	double num2;//4->8 8
	short num3;//16 2
	float num4;//18->20 4
	short num5;//24 2
	double num6;//26->32 8 ==>40
};


int main() {
	printf("%d\n", sizeof(struct C));
	getchar();
	return 0;
}

运行结果:

  

然后我们再来设置一些不同的字节对齐,又该如何计算结构体大小,比如下面的代码

#include <stdio.h>
#include <stdlib.h>

struct Data
{
	char name[12];
	short age;
};

void main()
{
	printf("%d\n", sizeof(struct Data));
	system("pause");
	return 0;
}

 先来看默认情况下

 

运行结果: 

 然后来设置1字节对齐:

一般1字节对齐,也就是最宽基本成员类型是1,基本就是把所有字节相加

运行结果:

 

下面说一下2、4、8、16字节对齐

以上这些对齐,打印出来的结果都是16,换句话说,对于上面的代码来说,他们的最宽基本类型都是2,那么这里也就是说,在你设置的字节对齐数与代码里面的字节对齐数之间,两者取其短来设置。

再来说一下共用体大小,一般来说,都会说共用体大小就是数据里面占用最宽的数据类型大小,那么我们看一下下面的代码

#include <stdio.h>
#include <stdlib.h>

struct Data
{
	char name[13];
	short age;
};


union MyUnion
{
	char name[23];
	int age;
};

void main()
{
	printf("%d\n", sizeof(union MyUnion));
	system("pause");
	return 0;
}

运行结果

为什么又是24呢,很明显也就是说,共用体的总大小也必须被最宽基本类型整除,上面最宽为int,4个字节,明显就是name会填充一个字节。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值