<C语言>结构体与联合体(共用体)的地址排布问题(内存字节对齐)
2017-08-15 18:32
597 查看
作者:wsg
时间:2017年8月15日
一、我们先来看看这个结构体的大小:
结果是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排到了第一位):
先猜想一下它的大小:16字节?
答案是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。
②如果结构体里面只有一个成员,结果也是该成员本来的大小。例如定义一个如下结构体:
考核一下是否理解了这个知识点,请问下面这个结构体的大小是多少(32位)?
答案是:
20
完!
时间:2017年8月15日
一、我们先来看看这个结构体的大小:
struct test { short a; double b; char c; }x;在32位系统下,short型占2个字节,double型占8个字节,char型占1个字节,那么该结构体所占空间大小是我们想象中的11个字节吗?
结果是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字节?
答案是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
完!
相关文章推荐
- <C/C++>C语言字节对齐问题总结
- C语言结构体中内存对齐的问题
- C语言 内存中结构体字节对齐
- 解析C语言结构体对齐(内存对齐问题)
- 结构体和联合体的内存对齐问题
- C语言 结构体的内存对齐问题与位域
- C语言中结构体存储的一个字节对齐问题
- C语言 内存中结构体字节对齐
- C语言,内存对齐,内存分配,地址操作,结构体(一)
- 结构体和联合体的字节对齐问题
- 【C语言】结构体中的内存对齐问题
- 关于C语言字节对齐之结构体 共用体占用字节数的快速计算方法总结
- C语言结构体中内存对齐问题
- C语言结构体的内存对齐问题
- 结构体获取成员偏移值、结构体内存中字节对齐问题
- C语言&nbsp;结构体的内存对齐问题与位域
- 结构体内存对齐问题(附案例解析)c语言
- C语言,内存对齐,内存分配,地址操作,结构体(二)
- C语言&nbsp;结构体的内存对齐问题与位域
- c语言中结构体的大小和内存对齐问题