user-0 提问: C语言 结构体字节问题

回复:
user: user-0
content: 引用 11 楼 lockonh 的回复:在默认情况下，为了方便对结构体内的元素进行访问和管理，当结构体内的元素的长度都小于处理器的位数的时候，便以结构体中最长的数据元素为对齐单位，即结构体的长度一定是最长的数据元素的长度的整数倍。如果结构体内存在大于处理器位数的元素，那么就以处理器的位数为对齐单元。 嗯，我想我明白了，回归了处理器内存对齐的原因，是为了减少存储器的访问次数。32位处理器根本就无法在一次内访问完8个字节的数据，按照8字节来对齐也没有意义。 看了这篇文章，http://hi.baidu.com/maikeai/item/4976f24cc0f905d3c1a592a0 可以结贴了。

user: user-0
content: 引用 10 楼 max_min_ 的回复:[quote=引用 9 楼 xumingjie1658 的回复:] [quote=引用 6 楼 max_min_ 的回复:] [quote=引用 4 楼 xumingjie1658 的回复:] [quote=引用 2 楼 user-5 的回复:] 你这规则是哪儿来的？ 看别人的文章。 http://blog.csdn.net/hyljqr/article/details/500899[/quote] 不要看那个博客吧！ 都是按4字节对齐的，你说的 struct s1{     char a;     char b; }: 这个4字节大小哪里不对 说出来， [/quote] 这个两字节呀。[/quote] 这是因为没有超过4字节大小长度，但是后面是有个两个字节空余的。[/quote] 那两个字节也是可以使用的。32位CPU完全可以进行8位的数据访问。

user: user-1
content: 在默认情况下，为了方便对结构体内的元素进行访问和管理，当结构体内的元素的长度都小于处理器的位数的时候，便以结构体中最长的数据元素为对齐单位，即结构体的长度一定是最长的数据元素的长度的整数倍。如果结构体内存在大于处理器位数的元素，那么就以处理器的位数为对齐单元。

user: user-2
content: 引用 9 楼 xumingjie1658 的回复:[quote=引用 6 楼 max_min_ 的回复:] [quote=引用 4 楼 xumingjie1658 的回复:] [quote=引用 2 楼 user-5 的回复:] 你这规则是哪儿来的？ 看别人的文章。 http://blog.csdn.net/hyljqr/article/details/500899[/quote] 不要看那个博客吧！ 都是按4字节对齐的，你说的 struct s1{     char a;     char b; }: 这个4字节大小哪里不对 说出来， [/quote] 这个两字节呀。[/quote] 这是因为没有超过4字节大小长度，但是后面是有个两个字节空余的。

user: user-0
content: 引用 6 楼 max_min_ 的回复:[quote=引用 4 楼 xumingjie1658 的回复:] [quote=引用 2 楼 user-5 的回复:] 你这规则是哪儿来的？ 看别人的文章。 http://blog.csdn.net/hyljqr/article/details/500899[/quote] 不要看那个博客吧！ 都是按4字节对齐的，你说的 struct s1{     char a;     char b; }: 这个4字节大小哪里不对 说出来， [/quote] 这个两字节呀。

user: user-0
content: 引用 2 楼 user-5 的回复:你这规则是哪儿来的？ 但是好像不对。

user: user-3
content: 不同的环境可能就不一样 查查pragma pack的字节对齐设置 或者默认的gcc的编译开关吧 面试的时候问这种问题的人肯定很无聊 如果是嵌入式系统把 typedef int u8； 嘿嘿 就更好玩了

user: user-4
content: #include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //

user: user-2
content: 引用 4 楼 xumingjie1658 的回复:[quote=引用 2 楼 user-5 的回复:] 你这规则是哪儿来的？ 看别人的文章。 http://blog.csdn.net/hyljqr/article/details/500899[/quote] 不要看那个博客吧！ 都是按4字节对齐的，你说的 struct s1{     char a;     char b; }: 这个4字节大小哪里不对 说出来，

user: user-0
content: 引用 2 楼 user-5 的回复:你这规则是哪儿来的？ 看别人的文章。 http://blog.csdn.net/hyljqr/article/details/500899

user: user-0
content: 引用 1 楼 max_min_ 的回复:32位系统的话，都是4字节对齐的！没有你说的那些 那不是的。 struct s1{     char a;     char b; }: 显然不是4字节对齐。 你说的这个原因不对。

user: user-5
content: 你这规则是哪儿来的？

user: user-2
content: 32位系统的话，都是4字节对齐的！没有你说的那些