從結構體成員獲取結構體位址的方法

2021-07-14 19:51:22 字數 820 閱讀 2306

今天朋友面試,有乙個問題他沒回答上來,我便在這裡給出答案,希望能幫助到一些準備找工作的同學。

因為結構體成員在記憶體中的儲存資料是按照成員定義順序儲存的,因此,要回答這個問題,首先得解決兩個問題

意識到這兩個問題,還得注意兩個細節:

1):c/c++語言中,對指標進行算數運算時指標跳過的記憶體是:sizeof(*ptr)*n ,其中n是算數運算時參與的值,ptr是指向變數的指標

2):可以通過 #define ptr &(((stud*) 0)->score) 來獲取結構體成員的偏移位址(原理比較簡單,但這是個很有用的技巧,一定要記住啊)該偏移位址以位元組為單位,並不是該成員在結構體中的順序。因此需要將指標轉化為void*型別進行運算奧

有了以上幾點基礎知識,就可以變成實現了:

#include

#include

typedef struct studentstud;

stud stu=;

#define ptr &(((stud*) 0)->score)

int main()

{void * mem_ptr =&(stu.score);

stud * stru_ptr = mem_ptr - (void *)ptr ;

printf("stru_ptr->weight: %d ",stru_ptr->weight );

return 0;

通過獲取的結構體指標來引用結構體成員,結果為初始化時的值,說明該方法正確;

另外,還可以根據以下方式獲取結構體中成員佔記憶體大小:

#define mem_size sizeof((((stud*) 0)->age))

結構體成員位址獲得結構體起始位址

經常我們在一些開源的或者核心 中會看到。define type struct ptr type member type char ptr unsigned long type 0 member 就是由結構體的成員位址獲得結構體的位址。引數 ptr 結構體的某個成員位址。type 結構體名 membe...

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

參考 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...

通過成員變數位址獲取結構體位址

linux中有乙個巨集 define container of ptr,type,member 實現略實現了通過成員變數位址獲取結構體位址的功能。今天我想好好想想這個實現的原理是怎麼來的。先定義乙個結構體吧 typedef struct abc 再來設計乙個函式用來實現功能 int main voi...