c++ - 结构奇怪的偏移

标签 c++ struct bmp

#include <cstdio>

struct BMP_Header
{
    unsigned char MN[2];
    unsigned int fileSize;
    char unused[4];
    unsigned int bitmapOffset;
};

struct DIB_Header
{
    unsigned int headerSize;
    unsigned int width;
    unsigned int height;
    unsigned short planes;
    unsigned short bits;
    unsigned int compresion;
    unsigned int rawDataSize;
    unsigned int hResolution;
    unsigned int vResolution;
    unsigned int palleteColors;
    unsigned int importantColors;
};

int main() {
    BMP_Header header1;
    DIB_Header header2;
    FILE *f = fopen("1.bmp", "rb");
    fread(&header1, 1, sizeof(BMP_Header), f);
    fread(&header2, 1, sizeof(DIB_Header), f);
    fclose(f);
    char *ptr = ((char*)&header1) + sizeof(unsigned short);
    printf("%d %d\n%d %d\n%d =?= %d\n", ptr - (char*)&header1, (char*)&(header1.fileSize) - (char*)&header1, sizeof(BMP_Header), sizeof(unsigned short), *(int*)ptr, header1.fileSize);
}

谁能告诉我为什么我的程序输出这个:

2 4
16 2
90 =?= 0

但是应该输出这个:

2 2
14 2
90 =?= 90

如果 2 个字符(BMP_Header 中的 MN)有 2 个字节大小,我不知道为什么 BMP_Header 中的 fileSize 有 4 个偏移量

我正在使用 MinGW

最佳答案

这是因为 C 和 C++ 编译器 pad通过在其间添加一个或多个字节来构造。这样做是为了提高数据访问效率。

例如,在第一种情况下,编译器在两字节 MN 成员和 fileSize 之间添加了两个字节,这是一个 int >,大概是因为在您的目标体系结构中,当其地址可被 4 整除时,访问 int 的速度会更快。

注意:您可以使用offsetof(struct BMP_Header, fileSize)而不是进行指针操作来计算 struct 相应元素的偏移量。

关于c++ - 结构奇怪的偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21496754/

相关文章:

c++ - 如何将值应用于结构内的字符串变量?

C++ 图像处理 - 将图像文件读入二维数组

android - 旋转 bmp 并将其正面朝上显示

c++ - BMP文件行填充问题

c++ - 如何使用每n个像素opencv计算直方图

c++ - 逻辑比较运算符

c++ - QT 5.10 文档中关于 Qt Quick 键盘焦点的错误?

function - 使用 Swift 结构构造函数作为函数

c++ - 将我的 Visual Studio C++ 项目从 64 位系统移动到 32 位系统

c - 在不使用 malloc() 的情况下,下面的程序如何工作?