2017-01-02 84 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