巨集求結構體的偏移位址

2021-08-17 02:03:31 字數 568 閱讀 9833

[cpp] view plain copy

在c語言中,ansi c標準允許值為0的常量被強制轉換成任何一種型別的指標,而且轉換結果是乙個空指標,即null指標,因此對0取指標的操作((type*)0)的結果就是乙個型別為type*的null指標。 但是如果利用這個null指標來訪問type型別的成員當然是非法的。

因為&(((type*)0)->field)的意圖只不過是計算field欄位的位址,c語言編譯器根本不生成訪問type成員的**,而僅僅是根據type的內容布局和結構體例項位址在編譯期計算這個常量位址,這樣就完全避免了通過null指標訪問記憶體可能出現的問題。同時又因為結構體位址是0,所以字段位址的值就是字段相對於結構體基址的偏移。

程式示例如下:

[cpp] view plain copy

struct mystr;

int main()

程式執行結果為(32位機器,char佔乙個位元組,short佔兩個位元組,double佔8個位元組,int佔4個位元組):

0結果分析:

上述方法避免了例項化乙個type物件,而且求值是在編譯期間進行,沒有執行期負擔,程式效率大大提高。

已知結構體成員位址,求該結構體的位址

參考 list entry 的方法 list entry get the struct for this entry ptr the struct list head pointer.type the type of the struct this is embedded in.member the...

如何獲取結構體某成員的偏移位址

我們假設結構體定義如下所示 cpp view plain copy print?include include struct test s 思路1 非常簡單,直接用位址差值即可求得。cpp view plain copy print?intmain intargc,char argv 思路2 考慮巨...

用乙個巨集求結構體某個變數的相對偏移量

用乙個巨集求結構體某個變數的相對偏移量 如 stuct student 則 find student,a 等於0 find student,b 等於4 definefind struc,e size t struc 0 e struc 0 表示將常量0強制轉化為struc 型指標所指向的位址,當然也...