#include <stdio.h>
int main()
{
//字节对齐:各种数据类型是按照一定的规则在内存当中排列的
//字节对齐会加快计算机对数据的存取效率
short a;
int b;
double c;
printf("%d,%d,%d\n",(int)&a%2,(int)&b%4,(int)&c%8);//对a取地址然后强制类型转化成int型数据,然后对2取余
//输出0,0,0,说明基本数据类型变量的地址是能够被他们所占字节的长度所整除的
struct Stu1
{
char a;
short b;
};
struct Stu2
{
char a;
int b;
};
struct Stu1 A;
struct Stu2 B;
printf("%d,%d\n",(int)&A%2,(int)&B%4);//输出0,0 1.说明结构体变量的首地址能够被其最宽基本类型成员的大小所整除
//输出A和B所占的字节数
printf("%d,%d\n",sizeof(A),sizeof(B));//输出4,8 2.结构体成员相对于结构体变量的首地址的偏移量(结构体变量的地址编号和结构体成员的地址编号所差的字节数)都是其成员大小的整数倍
printf("%d,%d\n",((int)&A.b-(int)&A)%2,((int)&B.b-(int)&B)%4);//得到A变量中b成员的地址,和A变量的地址,并把这两个地址强制数据类型转换成int型再相减,就会求得A变量当中b成员相对于A变量首地址的偏移量,再把这个偏移量对2取余,2是b成员所占的字节数
//输出0,0
struct Stu3
{
char a;
double f;
int b;
}C;
printf("%d\n",sizeof(C));//输出C变量所占的字节长度
//输出结果为24 3.结构体的总大小为结构体最宽基本类型成员的整数倍
struct Stu4
{
char a;
struct Stu2 b;//结构体嵌套,b分为b.a(char型)和b.b(int)型,从这两个里边找一个最宽的基本类型成员,很明显是b.b
}D;
/*
D中最宽的基本类型成员是D.b.b长度为4个字节,所以
1.D的首地址必须被4整除
2.D的长度必须被4整除
struct Stu2数据类型可知:
1.D.b的地址能够被4整除
2.D.b的长度能够被4整除,D.b的长度为8
*/
printf("%d\n",sizeof(D));//输出12 因为Stu2占8个字节
//如果结构体成员是复合数据类型的,那么它相对于结构体首地址的偏移量,应该是其最宽基本类型成员大小的整数倍
return 0;
}
结构体变量所占字节长度
最新推荐文章于 2024-09-01 22:08:18 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)