结构很奇怪 - C++

het*_*lek 1 c++ struct

这个愚蠢的结构我一直有很多麻烦.我不明白为什么会这样做,我真的不确定如何解决它.我知道如何修复它的唯一方法是删除结构并以其他方式执行(我不想这样做).

所以我正在从一个文件中读取数据,而我正在将它读入一个结构指针.看起来我的'long long'的偏移/指针每次都搞砸了.在下面详细查看.

所以这是我的结构:

struct Entry
    {
        unsigned short type;
        unsigned long long identifier;
        unsigned int offset_specifier, length;
    };
Run Code Online (Sandbox Code Playgroud)

这是我的代码,用于读取结构指针/数组中的所有废话:

Entry *entries = new Entry[SOME_DYNAMIC_AMOUNT];
fread(entries, sizeof(Entry), SOME_DYNAMIC_AMOUNT, openedFile);
Run Code Online (Sandbox Code Playgroud)

如您所见,我将所有内容写入结构数组中.现在,我将向您展示我正在阅读的数据(对于此示例中的第一个结构).

我正在读的字节.

所以这是进入'条目'中第一个元素的数据.第一项(短,'类型'),似乎读得很好.之后,当读取'标识符'时,似乎整个结构被移位了X个字节.这是第一个元素的图片(在反转endian之后):

在此输入图像描述

这里是内存中的数据(红色方块是它开始的地方):

在此输入图像描述

我知道这有点令人困惑,但我试图尽可能地解释它.感谢任何帮助,Hetelek.:)

Jam*_*lin 6

使用额外字节填充结构,以便更快地访问字段.您可以防止这种带有#pragma pack:

#pragma pack(push, 1)

struct Entry
{
    /* ... */
};

#pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)

请注意,这可能不是100%可移植的(我知道至少GCC和MSVC支持x86).