gpt4 book ai didi

c++ - 结构奇怪的偏移量

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:46:15 25 4
gpt4 key购买 nike

#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 中的文件大小有 4 个偏移量

我正在使用 MinGW

最佳答案

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

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com