说起结构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)的结果。一点小经验,拿出来共享,祝大家编程快乐!
分析c语言的struct 的大小
最新推荐文章于 2022-01-14 09:36:12 发布