最近在一套在线笔试题上看到了一道题,题目的大概内容是如下,求该结构体的大小
typedef struct{
char a;
int b;
float c;
double d;
char *p;
int * q;
short r;
}node;
在之前也有对结构体的端对齐有所了解,默认是8字节对齐方式(vc6),但是忘记了具体的细节。所以之后又搜索了一些相关的资料,参考<a target=_blank href="http://blog.sina.com.cn/s/blog_5f77c7270100dnoy.html">点击打开链接</a>,之后自己再测试并总结一下。
例如上述的结构体我在vc6下测试,结果输出的是40。
以下是在vc6下测试并总结出的。
#include <stdio.h>
#pragma pack (4)//设置n字节对齐的,详细可以参考上述的链接,感谢大神写的文章,解释的很清楚
typedef struct{
char a;//1字节
int b;//4
float c;//4
double d;//8
char *p;//4
int * q;//4
short r;//2
//按一字节对齐方式为27
//按4字节对齐方式为32 1+3 + 4 +4+ 8(此处不用将偏移量补为8的倍数,只需补为4字节对齐的4的倍数)+4+4+2=30然后还需将整个结构体补为4的倍数,所以再加上2
//按8字节及16字节方式都为40
//计算方法是:1+3+4+4+4(这个4是为了补齐8的倍数,在8字节类型出现之前只需补齐4字节即可)+8+4+4+2=34为补齐8的倍数再加上6=40
}node;
#pragma pack () //取消自定义字节方式
int main(){
printf("%d\n",sizeof(node));
}