结构体与联合体(共用体)的地址排布问题

时间:2022-09-05 18:03:59

作者:wsg

时间:2017年8月15日


一、我们先来看看这个结构体的大小:

struct test
{
short a;
double b;
char c;
}x;
在32位系统下,short型占2个字节,double型占8个字节,char型占1个字节,那么该结构体所占空间大小是我们想象中的11个字节吗?

<C语言>结构体与联合体(共用体)的地址排布问题


结果是16,并不是11,这是来的呢?我们先把这个问题放到一边,理解了变量的地址对齐之后就能弄明白了。

变量的地址对齐:在内存中开辟一块空间(即变量)时,并不是嘴边找一块适当大小的内存就可以了,这块内存的地址室友要求的。

例如:int型和double型的地址必须是4的整数倍,short型的数据必须是2的整数倍,这个要求就是所谓的地址对齐。

前面的结构体中,short占2个字节大小,但是后面遇到了double(double型所占空间为8字节,但在32位系统中,每次至少存取4个字节,故double型实际应拆分为4+4个字节),故short要向4个字节补齐,所有这里short实际上是占了4个字节大小的。

再看末尾的char,本来只需要1个字节大小就够,遵循地址对齐原则,实际上也是占了4个字节大小,所以结构体的大小是4+(4+4)+4=16(字节)。

二、我们再来看看这个结构体(与一相比,将char c排到了第一位):

struct test
{
char c;
short a;
double b;
}x;

先猜想一下它的大小:16字节?

<C语言>结构体与联合体(共用体)的地址排布问题

答案是12,怎么来的呢?与上面一样的原理,char型占1个字节大小,

后面遇到了short型,short占2个字节,故char型要与short型对齐,故char型实际占2个字节的。(需要注意的是,如果单独打印c的大小,结果还是1个字节)

char与short型各占2个字节,刚好是4个字节,再加上末尾double型的(4+4)个字节,结果就是12了。

注意:①如果单独打印结构体某个成员的大小,结果还是该成员本来的大小。例如printf("%d", sizeof(x.c));打印该代码中c的大小,结果还是为1。

②如果结构体里面只有一个成员,结果也是该成员本来的大小。例如定义一个如下结构体:

struct test
{
char a;
}x;
这里结构体x的大小就是char型数据的大小,也就是1个字节。为什么?因为只有c一个成员,自己跟自己对齐,还是1个字节。


考核一下是否理解了这个知识点,请问下面这个结构体的大小是多少(32位)?

struct test
{
short a;
char b;
char c;
char f;
int d;
double e;
}x;

答案是:



20


完!