QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1325|回复: 3

一个结构体的问题及解决办法--以前在windows下一直没有注意过。

[复制链接]
发表于 2002-11-19 13:08:40 | 显示全部楼层 |阅读模式
#define BYTE unsigned char
#define WORD unsigned short int
#define DWORD unsigned long int

typedef struct tagBMPHEAD
{
WORD bfType;
DWORD bfSize;
WORD bfReserved[2];
DWORD bfOffBits;
DWORD biSize;
DWORD biWidth;
DWORD biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
DWORD biXPelsPerMeter;
DWORD biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BMPHEAD;
各位会认为这个结构体的长度是多少,我数来数去只有54个字节。但用sizeof函数告诉我是56个字节。我把这个结构体填进数值,发现第一个WORD占了4个字节。后面的WORD一切正常!如果把第一个WORD改成BYTE或DWORD,结果整个结构体的长度还是56个字节。

后来我找了相关资料,终于在http://www.china-pub.com找到答案。地址是:
http://www.china-pub.com/computers/emook/1000/info.htm
看过这篇文章能纠正一些概念,以前只知道整个结构体大小要对界,即结构体大小为奇数时,系统 会自动把结构体大小加一,变成偶数字节,看了这篇文章才知道结构体里面还有这么多东西要注意。
发表于 2002-11-19 14:06:24 | 显示全部楼层
A nice post.  However I think I should point out that the real data-occupide space is 52 bytes:  There are two places that need alignment, the first member ``WORD'' and the third member ``WORD''.

And by the way, both your test and what the referenced article mentioned are only true for 32-bit machines.
回复

使用道具 举报

 楼主| 发表于 2002-11-19 14:19:51 | 显示全部楼层
第三个word不需要对界的,因为是一个word型数组,只有两个元素,所以正好是4个字节,正好符合接下去的DWORD的4个字节的对界要求。
回复

使用道具 举报

发表于 2002-11-19 15:12:14 | 显示全部楼层
[quote:fb24f3c9d0="netdigger"]第三个word不需要对界的,因为是一个word型数组,只有两个元素,所以正好是4个字节,正好符合接下去的DWORD的4个字节的对界要求。 [/quote]啊,你说的对,我忽视了那是个数组了。//shy
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 19:57 , Processed in 0.116629 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表