分析c语言的struct 的大小

来源:互联网 发布:影子网络 编辑:程序博客网 时间:2024/06/11 17:08


  说起结构struct,大家不会陌生,c语言中常用的一种数据类型,说起它的长度,也没啥新鲜的,不外乎把成员变量之长度加起来,聪明一点的还会接着告诉你,这是它和union的一大区别。近日来笔者鸟枪换炮,用上了vc5.0,在感受它的方便与强大的同时,也受到了形形色色的困扰,struct这个小东西就是其中之一。

  我用cfile类的一个对象操作一个文件,文件是由struct类型变量组成的,成员变量有7个float型,1个char型,char型变量占1字节,float型变量占4字节,4×7+1,我上小学的妹妹都会告诉你等于29,c语言中的sizeof(struct structname)自然更不会算错,fread(ptr,size,item,filehandle)用sizeof(struct structname)来控制每次读取的长度也很ok,可是我在vc中却遇到了麻烦,下面是我的程序,您也可以帮我挑挑错,不过可不要偷看后面的答案。

......

  struct data data1;

  lpctstr pfilename="s001.psd";

  cfile file(pfilename,cfile::moderead);

  int count=file.getlength()/sizeof(struct data);

  //得到文件中记录个数

  for(;count>0;count--)

{file.read(&data1,sizeof(struct data));

//以下是显示记录内容,因不用保存,只定义一个结构变量

......

}

  file.close();

......

  不知您看的效果如何,我的程序可是一团糟,显示的不是我想象中的模样。原因何在呢?我上看下看,左看右看,看不出所以然来。只好换法子来实现,cfile的成员函数是换不成,只有sizeof(struct data)了,不经意地把sizeof(struct data)改成了29,又不经意地一运行,竟然ok了!把sizeof(struct data)的结果显示出来,更惊诧了,32个字节!为了探究其中奥秘,我使用了物理学家常用的方法——实验法。我又定义了几个结构变量:

  struct test1

  {char a;

  int b;

  }test_1;

struct test2

  {char a;

   double b;

  }test_2;

  struct test3

  {char a;

  char b;

  char c;

  }test_3;

  struct test4

  {char a;

  int b;

  double c;

}test_4;

  不知您的结果如何,下面公布正确答案:

  sizeof(struct test1)=8

  sizeof(struct test2)=16

  sizeof(struct test3)=3

  sizeof(struct test4)=16

  都对了?希望不会,要不然下面的文章您就不看了。

  发现问题还得解决问题,凭着我的可怜的英语知识,在vc的帮助下,得到了一点说明,有兴趣并且英语好的同志可以查看#pragma pack(n)的帮助。出于兼容性的考虑,在结构变量有填充字节之说,上面的结果就是在默认情况下的结果,vc会根据结构变量中成员变量的类型来调整填充字节,您也可以用#pragma pack(n)中的n来指定填充字节,n可以取1,2,4,8等,如等于1,结果就会如同dos下c语言中sizeof(struct structname)的结果。一点小经验,拿出来共享,祝大家编程快乐!

原创粉丝点击