C offsetof巨集的詳解

2021-09-28 20:03:37 字數 1493 閱讀 6404

offsetof巨集

描述:

c 庫(stddef.h)巨集offsetof(type, member-designator)會生成乙個型別為size_t的整型常量,它是乙個結構成員相對於結構開頭的位元組偏移量。成員是由 member-designator 給定的,結構的名稱是在 type 中給定的。

宣告:

offsetof

(type, member-designator)

引數:type:這是乙個結構體型別

member-designator:這是乙個結構體型別的成員指示器

返回值:

該巨集返回型別為size_t的值,表示 type 中成員的偏移量。

例項:演示 offsetof() 巨集的用法

#include

#include

struct s1

;int

main()

生成圖如下:

offsetof巨集的實現如下:

#define offsetof(type,member) (size_t)&(((type *)0)->member)
功能:返回結構體type中member成員相對於結構體首位址的偏移量,以位元組為單位。

解析:(從內向外、逐層理解)

首先,(type *)0表示將數字0強制型別轉換為type型別(type為結構體型別)的指標。因此這裡的0代表記憶體位址0,即我們認為記憶體位址0開始的sizeof(type)個位元組內儲存的是乙個type型別的變數。

然後,((type *)0)->member 得到該結構體變數中的member成員變數,

&(((type*)0)->member) 使用取位址符&取得了member成員變數的位址,(size_t)加在前面表示將member成員變數的位址強制型別轉換為size_t(即unsigned int),並將結果作為巨集的返回值。

可見,offsetof巨集返回的是member成員在記憶體中的實際位址。又因為整個結構體的首位址是0,因此member成員的實際位址在數值上就等於member成員相對於結構體首位址的偏移量。(當前位址-首位址=偏移量)

擴充套件思考

使用offsetof巨集會影響記憶體0位址處的值嗎?不會

offsetof巨集的運算是在c編譯器預編譯時完成的,因此記憶體的0位址在機器指令中根本未被操作,當然不會影響其值了。

container of巨集詳解

該巨集位於include linux kernel.h 1.定義格式 define container of ptr,type,member 作用 就是根據乙個結構體變數中的乙個域成員變數的指標來獲取指向整個結構體變數的指標。例 struct demo struct struct demo stru...

list entry()巨集詳解

define list entry ptr,type,member type char ptr unsigned long type 0 member lish.h中定義 define list entry ptr,type,member container of ptr,type,member d...

C C 巨集詳解

c c 巨集詳解 眾多c 書籍都忠告我們c語言巨集是萬惡之首,但事情總不如我們想象的那麼壞 眾多c 書籍都忠告我們c語言巨集是萬惡之首,但事情總不如我們想象的那麼壞,就如同goto一樣。巨集有 乙個很大的作用,就是自動為我們產生 如果說模板可以為我們產生各種型別的 型別替換 那麼巨集其實可以為我們在...