通過巨集函式計算結構體成員偏移量

2021-09-25 18:07:40 字數 2013 閱讀 4266

編譯器在為結構體成員分配記憶體時,由於存在記憶體對齊機制,各個成員所佔空間可能不是連續的,因而不能簡單的通過成員型別所佔的字長來推斷其它成員或結構體物件的位址。

獲得結構體成員偏移量的方法可以參照部落格:

現在主要以第二種方法(通過巨集函式計算結構體成員偏移量)為例,做簡單整理和介紹

(注:typeof還沒有寫進c++標準,只是gcc裡面的,但c++引入了decltype和auto關鍵字,如果是用c++編寫的**,則可以用decltype(c++ 11)替代typeof)

如果你僅僅是想根據初始化值為乙個變數推斷合適的資料型別,那麼使用auto是乙個更加簡單的選擇。當你只有需要推斷某個表示式的資料型別,例如某個函式呼叫表示式的計算結果的資料型別,而不是某個變數的資料型別時,你才真正需要delctype。具體可以參考部落格:

gcc編譯:

#include #define get_offset(data,member)   (size_t)(&(((typeof(data)*)0)->member))

typedef struct studentstudent_t;

int main(int argc, char const *ar**)

**分析如下:

1. typeof 關鍵字:

用於獲取修飾修飾變數的資料型別。比如 int value; typeof( value ) 的作用是獲得 value 的資料型別int 。

用法:int value; 我想要定義乙個 和value這個變數型別一樣的新變數new_value ;

操作像這樣: typeof(value) new_value ;

該用法可以用在函式的值傳遞中,在不知道值的型別的時候,可以定義和它型別相同的新變數。

2. typedef :

為資料型別起乙個名字 :比如 typedef struct student student_t ;

約定 :一般新名字後面以 _t 結尾,表示是乙個構造出來的新型別名字,便於理解。

student_t stud1 ; 等價於 struct student stud1 ; 很顯然 前者更有利於移植和閱讀。

3. ((data_type )0)

作用:把數字 0 強制轉換成 (data_type) 型別的指標。

比如:( struct student * )0 的作用是把 0 轉換成 struct student型別的指標,用於引用struct student資料型別型別的成員。

在這個題目中: ((typeof(data)*)0)->member 的目的是 把 0 轉成 data 變數對應的資料型別的指標,然後通過該指標引用該型別的成員的值。

對於本題而言: (size_t)(&(((struct student *)0)->d)) : & 用以獲取struct student結構的成員d ,然後,獲得d 的位址,將它轉成 size_t 的資料型別量。

其中 size_t 的定義是 typedef unsigned int size_t ;

(size_t)(&(((struct student *)0)->d)) 它的值是變數d的位址,為什麼是偏移值呢? 因為 起始位址我們認為規定為 0。

4. size_t :

typedef unsigned int size_t ;
原文:

c++編譯:

計算結構體偏移量

如果能夠讓 unsigned long type 的值為0,即 type 0的時候,那麼offset的值就是簡單的 offset unsigned long type.c 如果說 type 0,那麼type.c就可以等價於 type t 0 c。但是這個語句是不能單獨存在的,因為對null指標訪問成...

結構體成員變數偏移量

我們先來定義一下需求 已知結構體型別定義如下 struct node t 且結構體1byte對齊 pragma pack 1 求 結構體struct node t中成員變數c的偏移。注 這裡的偏移量指的是相對於結構體起始位置的偏移量。有三種方法 1.使用巨集offsetof 2.定義乙個結構體,用結...

C C 結構體成員偏移量獲取

分析 節選自muduo.以下 通過offsetof獲取sin family在sockaddr in6中的字段偏移量.static assert offsetof sockaddr in6,sin6 family 0,sin6 family offset 0 需要注意 offsetof並非c c 標準...