出于教育目的,我想通过指针访问此类的第二个字段:
struct Foo {
Foo(char a, double b): a(a), b(b) {}
char a;
double b;
};
我这样做:
Foo *foo = new Foo('a', 2.0);
std::cout << *((double *)((char *)foo + 1)) << std::endl;
作为回应,我得到了垃圾。我不明白为什么。我有点将指针移到一个char,我正在尝试阅读如何double. 我的错误是什么?
有数据对齐这样的东西。因此,大多数编译器会在和之间插入一些未使用的字节(填充),
c并b以某种类似的方式将此结构打包到内存中:要在 C/C++ 语言中获得这样的偏移量,有一个宏
offsetof. 因此,地址的正确收据将如下所示:宏的一种可能实现可以扩展为这样的*:
但在实践中,这通常是使用编译器内置函数来实现的。
* 不要在实际代码中使用,包含一个半UB