C++Builder中sizeof出错?(0分)

  • 主题发起人 主题发起人 radio_kang
  • 开始时间 开始时间
R

radio_kang

Unregistered / Unconfirmed
GUEST, unregistred user!
有碰到过sizeof出错吗?
在C++Builder中,sizeof(BITMAPFILEHEADER) == 16???所以读文件也不对了,
为什么?
 
······好像少了什么
说不上来···^_^
 
BITMAPFILEHEADER怎么定义的?
 
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
所以sizeof(BITMAPFILEHEADER)应该是14才对啊,可C++Builder6是16
而C++Builder5就对了,为什么呢?
 
这是正常的,结构的存储大小可能大于或等于其逻辑大小。
在pascal中可以用packet record来解决,但C中,不知该怎么办。
 
块的大小都是32位的倍数,也就是4字节的倍数.不足4字节的倍数,会自动补齐.所以结构的大小是16而不是14.
 
可在C++Builder5.0中是对的,我调data alignment也没用
难道6.0和5.0连这个都不同?
我该怎么办啊,各位救救我啊
 
使用下面的方法可以实现按字节对齐
#pragma pack(1) //下面定义的所有变量、结构在内存中将以字节对齐方式存储
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
#pragma pack() //恢复原始状态
 
晕本来就是16嘛
DELPHI是以4字节为单位的,
如果不足以为4的倍数
DELPHI会自动帮你加上去的
如果你非要弄成14你就用PACK
 
但我自己声明一个struct和BTIMAPFILEHEADER一样,它的size就是14,why?
在c++builder5.0中就是正确的,why?
而且难道以后这种经常用的sizeof操作都要那么麻烦?
 
把你的struct贴出来看
 
就和BITMAPFILEHEADE一样啊:
typedef struct tagMYBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} MYBITMAPFILEHEADER, *PMYBITMAPFILEHEADER;
就是对的,why?
 
我没有BCB,但我在turbo C下得出的仍然是16。
 
我在TC2.0下也试了一下,把WORD换成short, 把DWORD换成long,结果还是14.
你的tc是什么版本?
 
非常抱歉,我本来用的是Tornado,一个嵌入式系统的开发环境,编译器是gcc,我又
用Turob C试了一下,改成short和long之后确实是14。

>>难道以后这种经常用的sizeof操作都要那么麻烦
确实是这样。
 
[:D]在默认情况下编译器都会对内存进行优化,即按字对齐方式存储,如果要按字节对齐,必须在代码中加入编译开关或在编译环境中设置(每种编译器各异,最好先阅读相关的文档)。
 
后退
顶部