C语言结构体大小问题,求指点
如题,在某处看到某人提问,还没人为他解答,经过测试,结果有点奇怪,在这里求指点。
- C/C++ code
#include <stdio.h>void main(){ struct m { char a[10]; char b[10]; int aa; int bb; }; printf("\n%d",sizeof(struct m)); struct m2 { char a[10]; int aa; int bb; char b[10]; }; printf("\n%d",sizeof(struct m2)); //为什么这个等于32,不等于28??难道是我的编译器问题??}[解决办法]
百度位对齐
一般是2的n次方
[解决办法]
刚跑了下程序,确实如楼主所说,同求解释
[解决办法]
不是你编译器的问题,结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
[解决办法]
int aa未对齐的话会在+10偏移位置上,不利于读写,所以被调整到了+12。
然后整个结构大小就从28上升到了30,但30仍旧是个造成对齐问题的隐患,紧接其后的其它变量又会落到两次总线读写的位置上。所以,编译器就把整个结构的尺寸调整到了32来避免发生对不齐现象。
[解决办法]
建议去看下数据对齐的知识点。可参考一下网址
http://apps.hi.baidu.com/share/detail/31064911
[解决办法]
对齐的问题……VC是8吧……
[解决办法]
- C/C++ code
struct m2 { char a[10]; // 0~9 int aa; // 12~15 int bb; // 16~19 char b[10]; // 20~29 };
[解决办法]
m2的对齐数是4bytes,所以,结构体的大小须为4的倍数
- C/C++ code
struct m2 { char a[10]; // 0~9,这里会补2bytes,0 ~ 11 int aa; // 12~15 int bb; // 16~19 char b[10]; // 20~29,这里会补2bytes, 20 ~ 31 };
[解决办法]
如果像下面那样,sizeof(m2)就是28了
- C/C++ code
struct m2{ int aa; // 0 ~ 3 int bb; // 4 ~ 8 char a[10]; // 9 ~ 18 char b[10]; // 19 ~ 27};
[解决办法]
计算机的字节对齐机制
[解决办法]
学习了。。。
[解决办法]
m2的对齐数难道不是10吗,为什么是4?
[解决办法]
10那个是数组,它的类型是char,只有1字节尺寸。