结构体大小

本文详细解析了结构体大小的计算方法及其背后的地址对齐原理,并通过多个实例展示了如何确定结构体中各成员的偏移量及整体大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结构体大小是考试常考也是重点的内容。

 

 

结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。然后我们看一个名词,这个名词是从网上看到的定义--偏移量。偏移量指的是结构体变量中的成员的地址和结构体变量地址的差。用一个图来解释

 

如果是第一个,那么明显105不能整除4,下面的一个空掉三个格子,108就可以整除4,因此应该为8

 

 

 

下面练习几个:

 

struct A

{

int a;//4

int b;//4

 

} //8

 

 

 

这个结构体长度就是8

 

 

 

struct C

{

 

char a;//1+1

short b;//2

int c;//4

}

这个结构体大小应该为8

 

而下面一个例子就不同于上面的了

struct C

{

short a;//2

char b;//1+5

double c;//8

int *d;//4

float e;//4

这个结构体的大小就是24.short类型是2,char类型是1,而double类型是8,所以前面要能被8除尽,然后总和。

 

 

重点来了:

1.结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍);

2.结构体大小必须是 “所有”成员大小的整数倍,记住是所有。

这些都不难从上面看出

 

下面还有别的类型的例子,一起看看:

struct EE

{

int a;

float b;

}

struct E

{

char c;

struct EE d;//8

可以自己想想这个结构体大小是多少

 

是12. 对了吗?看看原因

int 和 float 都是4,char 是1 ,那么先看E这个结构体,char就应该为1+3,而有人就会算为16,想着EE是8,就还得加4,那就是8+8就是16,不对的。最终值能整除单个最大数据类型,是单个,所以4+8就行了,就是12啦。

再看看几个吧:

struct F

{

char c;//1+7

double d;//8

)//为16

 

struct G

{

int a;//4

char b;//1

}那么这个呢也是8,不要以为它是5,看图:

 

 

 

 

 

 

以数组来说的话105就不可以除尽,不行

相似例子:

 

 

 

 

 

 

struct H

{

 

 

 

char a;//1+3

 

 

 

int b;//4

short c;//2

}//12

 

 

 

有人会算为10,不对的 ,前面有说过要是所有成员的整数倍,而10不能除尽4,应为12

那么,怎么求这个长度呢,对于32位系统来说,用sizeof(char)=1,sizeof(int)=4就ok。

差不多分析完了,希望对你有用!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值