2017-01-02 47 views
0

这段代码如何,它是标准的吗?我已经在Visual C++头文件中看到过这种代码,它可以计算某些结构成员的偏移量,但它是如何工作的?无需实例化计算结构构件的偏移

#include <iostream> 

struct Foo 
{ 
    int a; 
    int b; 
    int c; 
}; 


int main(int argc, char** argv)  
{ 
    int* i1 = (&((Foo*)0)->a); 
    int* i2 = (&((Foo*)0)->b); 
    int* i3 = (&((Foo*)0)->c); 

    std::cout << "i1 = " << i1 << "\ni2 = " << i2 << "\ni3 = " << i3 << "\n"; 
    return 0; 
} 

Results : i1 = 0, i2 = 4, i3 = 8 

编辑: 只记得我之前看过这个代码的地方。它在WinNT.h

#define FIELD_OFFSET(type, field) ((LONG)(LONG_PTR)&(((type *)0)->field)) 
+1

在''中定义了一个标准的宏'offsetof(structure,field)',正是这样做的。所以是的,代码是有效的,但使用标准宏将使其更加标准。 – DyZ

+0

TL; DR:实现可以做这样的事情,你不能。 –

+0

我不能做什么,我可以做到,我的程序有效。 – nikau6

回答

2

这是相当普遍的,因为宏offsetof。看看http://en.cppreference.com/w/cpp/types/offsetof

它作为每个成员的内存位置和结构的内存位置的距离。在你的例子中,你将struct的内存位置设置为0,因此不需要计算距离。

+0

如果您将您的内存位置设置为0 ...操作符“ - >”是否会出现分段错误? – ChaoSXDemon

+2

段错误发生在实际尝试访问成员变量或调用成员函数时。用&,你只是计算内存地址。 – xosp7tom

+1

即使从位置0开始,计算偏移量仍然很有用。 – nikau6