我在内存中有一个结构,但并非所有成员都已知(该结构是逆向工程的)。我想做的是在内存中表示如下:
struct Name {
long Id;
byte unknown[32];
float X;
};
但我希望 byteknown[32]
不可见,因此当我使用 Name
类型的内容时,我只能看到 2 个变量 Id 和 X。我认为它类似于:
struct Name {
long Id;
byte : 32*8; // So this doesn't appear
float X;
};
但这不起作用 1. 因为我每行只能使用 8 个字节,所以它必须看起来像:
struct Name {
long Id;
long long : 64;
long long : 64;
long long : 64;
long long : 64;
float X;
};
其次,当我实际尝试这样做时,它并没有按预期工作(访问 X 并不引用结构的偏移 0x24)。
最佳答案
您的方向是正确的,但您只是细节错误。编译器将对齐填充插入到您的 Name
版本中。该程序可能会执行您想要的操作:
#include <cstddef>
#include <iostream>
#include <cassert>
struct Name {
long Id; // offset 0x00
int : 32; // offset 0x04
long long : 64; // 0x08
long long : 64; // 0x10
long long : 64; // 0x18
int : 32; // offset 0x20
float X; // offset 0x24
};
int main () {
assert(sizeof(int) == 4);
assert(sizeof(long) == 4);
assert(sizeof(float) == 4);
assert(sizeof(long long) == 8);
assert(offsetof(Name, Id) == 0);
assert(offsetof(Name, X) == 0x24);
}
或者,您可以研究#pragma pack
。
注意:对于您的问题,没有可移植的、标准认可的解决方案。编译器可以(几乎)自由地在他们选择的任何地方以任何方式插入填充字节。但可能存在不可移植的、编译器认可的解决方案,例如上面的两个。
关于c++ - 如何在结构体中声明填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10706602/