读书人

C语言结构体大小疑点求指点

发布时间: 2012-04-04 16:38:51 作者: rapoo

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字节尺寸。

读书人网 >C语言

热点推荐