C语言中字符对齐(内存对齐)问题(测试环境visual studio 2010)

来源:互联网 发布:js点击空白关闭弹出层 编辑:程序博客网 时间:2024/05/16 00:36


自然对界:一个变量的内存地址正好位于它长度的整数倍


有关结构的字符对齐方式:

结构体内的变量按照自然对界对齐,数组如char a[10]的自然对界是1Byte。

结构体按照结构体内最大的自然对界进行对齐

例子:

struct test{int g;char w[10];double l;char gwl;};int _tmain(int argc, _TCHAR* argv[]){printf("%d",sizeof(struct test));getchar();return 0;}
运行结果:32 

32 = 4+10+(2+8)+1+7

有关union的字符对齐方式:

按照union内成员最大的自然对界进行对齐

整个union大小为占空间最大的成员按上述对齐方式对齐后的大小

例子:

union test{int g;char w[10];double l;char gwl;};int _tmain(int argc, _TCHAR* argv[]){printf("%d",sizeof(union test));getchar();return 0;}
运行结果:16

按照double的自然对界进行对齐,union的大小为成员char w[10]的大小


关于自己定义字符对齐方式

#pragma pack(n)..代码.#pragma pack()//取消自定义对齐方式
结构体中成员对齐方式为n与自然对界中较小的(union相同,最后取成员中最大的对齐方式)

例子:

#pragma pack(2)struct test{int g;char w[10];double l;char gwl;};int _tmain(int argc, _TCHAR* argv[]){printf("%d",sizeof(struct test));getchar();return 0;}#pragma pack()
运行结果:24

24 = 4+10+8+1+1



原创粉丝点击