关于struct调用sizeof的一个问题

来源:互联网 发布:膜法传奇知乎 编辑:程序博客网 时间:2024/05/16 12:20

64位与32位linux c开发时默认字节对齐方式分别为8和4。


在默认情况下,32位操作系统字节对齐方式是4个字节,但64位操作系统,字节对齐是8个字节。


看下面的例子

#include <stdio.h>typedef union {        int data[5];}DATA;int main(int argc,char **argv){        DATA data;        printf("%d \n",sizeof(data));        return 0;}
上面的运行结果是 【 20 】(64位机器)

再看下面的例子

#include <stdio.h>typedef union {        int data[5];        long id;}DATA;int main(int argc,char **argv){        DATA data;        printf("%d \n",sizeof(data));        return 0;}
上面的运行结果是 【 24 】,按照一般情况,我们是说union的字节数大小是等于最大的那个,就是20。。。。。

再看一个例子

#include <stdio.h>typedef union {        int data[4];        long id;}DATA;int main(int argc,char **argv){        DATA data;        printf("%d\n",sizeof(data));        return 0;}

上面的运行结果是 【 16 】

其实上面的结果就是对齐之后的结果,特别是24的,它是从第三个8个字节位置开始对齐。所以它的大小是 int data[4] + long。

因此,在计算结构体的sizeof时,不但要考虑对齐的字节数,还要考虑开始对齐的位置,其实也就是对齐方向(大端小端的问题了)


0 0