您当前的位置: 首页 > 

鱼儿-1226

暂无认证

  • 0浏览

    0关注

    1100博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

sizeof结构体分析

鱼儿-1226 发布时间:2022-10-13 13:52:02 ,浏览量:0

   最近看书总是遇到定义一个结构体,然后问你sizeof(此结构体)的值是多少?

         本人看了看一书,由做了些实验。总结一下:

1:

Java代码 

 

  1. struct Foo{  
  2.     int a;  
  3.     union U{  
  4.           
  5.     }u;  
  6.       
  7. };  
  8. int main()  
  9. {  
  10.     printf("%d\n",sizeof(Foo));  
  11.     system("pause");  
  12.     return 0;  
  13. }  

 输出:8

因为空的Union占一个字节。默认4字节对齐。

2:

Java代码 

 

  1. #pragma pack(2)  
  2. struct Foo{  
  3.     int a;  
  4.     union U{  
  5.           
  6.     }u;  
  7.       
  8. };  
  9. int main()  
  10. {  
  11.     printf("%d\n",sizeof(Foo));  
  12.     system("pause");  
  13.     return 0;  
  14. }  

 这样要是指定是2字节对齐,那么输出结果就是2了。

3:

Java代码 

 

  1. #pragma pack(2)  
  2. struct Foo{  
  3.     int a;  
  4.     union U{  
  5.           
  6.     };  
  7.       
  8. };  
  9. int main()  
  10. {  
  11.     printf("%d\n",sizeof(Foo));  
  12.     system("pause");  
  13.     return 0;  
  14. }  

 注意这里有一个陷阱,union没有声明变量,只有一个定义。所以输出结果为:4(仅为int的字节数)

4:

Java代码 

 

  1. struct Foo{  
  2.       
  3. };  
  4. union E{  
  5.   
  6. };  
  7. int main()  
  8. {  
  9.     printf("%d\n",sizeof(struct Foo));  
  10.     printf("%d\n",sizeof(union E));  
  11.     system("pause");  
  12.     return 0;  
  13. }  

 这样的话,输出都为1。

结果:

1

1

5:

Java代码 

 

  1. struct Foo{  
  2.     union E{  
  3.         };  
  4. };  
  5.   
  6. int main()  
  7. {  
  8.     printf("%d\n",sizeof(struct Foo));  
  9.     //printf("%d\n",sizeof(union E));  
  10.     system("pause");  
  11.     return 0;  
  12. }  

 结果:

1

反之将struct放进union中也是一样。甚至改成:

Java代码 

 

  1. struct Foo{  
  2.       
  3. }s;  
  4. union E{  
  5.   
  6. }e;  

 sizeof(e)和sizeof(s)也是1。

6:接下来言归正传,##pragma pack(n)有时候是会失效的(在n>struct成员占位最大的那个值的时候失效)。比如:

Java代码 

 

  1. #pragma pack(4)  
  2. struct Foo{  
  3.     char a;  
  4.     char b;  
  5.     char v;  
  6. };  
  7. int main()  
  8. {  
  9.     printf("%d\n",sizeof(Foo));  
  10.     system("pause");  
  11.     return 0;  
  12. }  

因为,结构体最大的占位成员占1字节,所以#pragma pack(4)失效。按照1字节对齐,输出结果:

3

所以只有在n>struct成员占位最大的那个值的时候(对于数组结构,只取其一个元素所占的大小进行比较),#pragma pack(n)才会有效。

比如:

Java代码 

 

  1. #pragma pack(4)  
  2. struct Foo{  
  3.     double b;  
  4.     char a;  
  5.     char c;  
  6. };  
  7. int main()  
  8. {  
  9.     printf("%d\n",sizeof(Foo));  
  10.     system("pause");  
  11.     return 0;  
  12. }  

 运行结果是:

12

7:函数和类型重定义不占空间,比如:

Java代码 

 

  1. struct Foo{  
  2.     void foo(int a){}         //不带分号  
  3.     typedef int INT;          //带分号  
  4. };  
  5. int main()  
  6. {  
  7.     printf("%d\n",sizeof(Foo));  
  8.     system("pause");  
  9.     return 0;  
  10. }  

 结果:

1

8:enum的声明是不占字节的。enum变量占四个字节。

Java代码 

 

  1. struct Foo{  
  2.     enum Color{a,b} f;  
  3. };  
  4.   
  5. int main()  
  6. {  
  7.     printf("%d\n",sizeof(struct Foo));  
  8.     system("pause");  
  9.     return 0;  
  10. }  
  11. //结果  
  12. 4  

Java代码 

 

  1. struct Foo{  
  2.     enum Color{a,b};  
  3. };  
  4.   
  5. int main()  
  6. {  
  7.     printf("%d\n",sizeof(struct Foo));  
  8.     system("pause");  
  9.     return 0;  
  10. }  
  11. //结果  
  12. 1  

Java代码 

 

  1. enum Kala{fa,faa,faaa};  
  2. int main()  
  3. {  
  4.     printf("%d\n",sizeof(enum Kala));  
  5.     system("pause");  
  6.     return 0;  
  7. }  
  8. //结果  
  9. 4  

9:好了先到这里,看一个题:

猜猜下面sizeof(Foo)输出多少?

Java代码 

 

  1. #pragma pack(2)   
  2. struct Foo  
  3. {   
  4.     int i;   
  5.     union U   
  6.     {   
  7.         char buff[13];   
  8.         int i;   
  9.     }u;   
  10.     void foo() {    }   
  11.     typedef char* (*f)(void*);   
  12.     enum{red, green, blue} color;   
  13. };   
  14. int main()  
  15. {  
  16.     printf("%d\n",sizeof(struct Foo));  
  17.     system("pause");  
  18.     return 0;  
  19. }  
  20. //结果:  
  21. 22(4+13+1+4)  

关注
打赏
1604459285
查看更多评论
立即登录/注册

微信扫码登录

0.0404s