首页
社区
课程
招聘
[旧帖] [求助]结构体字节对齐 0.00雪花
发表于: 2013-10-25 10:22 1747

[旧帖] [求助]结构体字节对齐 0.00雪花

2013-10-25 10:22
1747
#include<stdio.h>
#include<windows.h>
int main()
{
BITMAPFILEHEADER bfh;		
//BITMAPINFOHEADER bih;

printf("bfh=%d\n",sizeof(bfh));
//printf("bih=%d\n",sizeof(bih));
printf("sizeof(BITMAPFILEHEADER)=%d\n",  sizeof(BITMAPFILEHEADER));
//printf("sizeof(BITMAPINFOHEADER)=%d\n",sizeof(BITMAPINFOHEADER));


}

/**************************
typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;
        DWORD   bfSize;
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;
} BITMAPFILEHEADER;
****************************/


BITMAPFILEHEADER结构的大小为什么会是14呢?
为什么不是按照4字节对齐?
我觉得应该是这样:
|WORD|   填充  |
|     DWORD     |
|WORD|WORD |
|     DWORD     |
16字节

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
在内存中对齐,在文件中不对齐。
在代码中肯定有所体现
例如
#pragma pack(push,1)。。。#pragma pack(pop)也不知道对不对
2013-10-25 21:16
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
#include<stdio.h>

//自己设计一个与windows.h定义的结构体BITMAPFILEHEADER
//大小相同的结构体 _BITMAPFILEHEADER
//原结构体:
/**************************
typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;
        DWORD   bfSize;
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;
} BITMAPFILEHEADER;
****************************/

struct _BITMAPFILEHEADER {
        short int    bfType;
        int   bfSize;
        short int    bfReserved1;
        short int    bfReserved2;
        int   bfOffBits;
};

int main()
{
_BITMAPFILEHEADER bfh;		

printf("sizeof(int)=%d\n",sizeof(int));
printf("sizeof(unsigned int)=%d\n",sizeof(unsigned int));

printf("bfh=%d\n",sizeof(bfh));
printf("sizeof(_BITMAPFILEHEADER)=%d\n",  sizeof(_BITMAPFILEHEADER));

}


结果:

修改代码,在结构体前后添加#pragma pack:
#pragma pack(2) //  2字节对齐
struct _BITMAPFILEHEADER {
        short int    bfType;
        int   bfSize;
        short int    bfReserved1;
        short int    bfReserved2;
        int   bfOffBits;
};
#pragma pack() // 恢复先前的pack设置 

结果:

看来windows里此结构体为2字节对齐...
上传的附件:
2013-10-26 11:04
0
雪    币: 215
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你的程序开头加上#pragma pack(4),就是16个字节了,如果加上#pragma pack(2),就是14个字节
2013-10-26 11:11
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢各位热心的解答。
2013-10-26 11:20
0
游客
登录 | 注册 方可回帖
返回
//