Chinaunix首页 | 论坛 | 博客
  • 博客访问: 424476
  • 博文数量: 126
  • 博客积分: 35
  • 博客等级: 民兵
  • 技术积分: 1262
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-19 16:39
文章分类

全部博文(126)

文章存档

2017年(2)

2016年(20)

2015年(64)

2014年(24)

2013年(16)

我的朋友

分类: C/C++

2013-12-03 14:14:15


  1. #include <asm/types.h>
  2. #include <stdio.h>
  3. #include <sstream>
  4. #include <string>
  5. using namespace std;

  6. typedef __s8 Int8;
  7. typedef __u8 Uint8;
  8. typedef __s16 Int16;
  9. typedef __u16 Uint16;
  10. typedef __s32 Int32;
  11. typedef __u32 Uint32;
  12. typedef __s64 Int64;
  13. typedef __u64 Uint64;

  14. typedef struct S1
  15. {
  16.     Uint8 a;
  17.     Int8 a2;
  18.     Int32 b;
  19.     Uint16 c;
  20. }S1;

  21. #pragma pack(1)
  22. typedef struct S2
  23. {
  24.     Uint8 a;
  25.     Int8 a2;
  26.     Int32 b;
  27.     Uint16 c;
  28. }S2;
  29. #pragma pack()

  30. int main(int argc, char** argv)
  31. {
  32.     S1 data1;
  33.     memset(&data1,0,sizeof(data1));
  34.     S2 data2;
  35.     memset(&data2,0,sizeof(data2));
  36.     printf("sizeof(S1):%d\n",sizeof(S1));
  37.     printf("sizeof(S2):%d\n",sizeof(S2));

  38.     ostringstream oss1,oss2,oss3,oss4;
  39.     oss1 << (int)data1.a << data1.a2 << data1.b << data1.c;
  40.     oss2 << data2.a << data2.a2 << data2.b << data2.c;
  41.     oss3 << (int)data1.a << (int)data1.a2 << data1.b << data1.c;
  42.     oss4 << data2.a << (int)data2.a2 << data2.b << data2.c;
  43.     printf("%s\n",oss1.str().c_str());
  44.     printf("%s\n",oss2.str().c_str());
  45.     printf("%s\n",oss3.str().c_str());
  46.     printf("%s\n",oss4.str().c_str());

  47.     return 0;
  48. }
输出结果:
  1. sizeof(S1):12
  2. sizeof(S2):8
  3. 0

  4. 0000

gdb调试:

  1. (gdb) p data1
  2. $1 = {a = 0 '\000', a2 = 0 '\000', b = 0, c = 0}
  3. (gdb) p data2
  4. $2 = {a = 0 '\000', a2 = 0 '\000', b = 0, c = 0}
结构体的成员变量a,虽然我们可以把它当作整型使用,但是ostringstream应该是当作字符处理了,ascii码表的值为0的元素实际上就是空。
gdb调试里,显示为= 0 '\000',可能是系统对于a做了两种显示而已。


阅读(822) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~