C語言 結構體中屬性的偏移量計算

2021-09-08 15:01:38 字數 895 閱讀 3126

//

計算結構體偏移量

#include

#include

#include

//詳解:對於offscfof()函式,

//(type *)0這句的意思是將記憶體位址是0記憶體塊轉換成乙個type型別的指標

//那麼此時0位址的指標的步長就是type,

//(type *)0)->member這句話是取type結構體的member屬性(注意此時type結構體的指標的值是0)

//&((type *)0)->member,&就是取位址的運算子,這句話的意思是取type結構體的member屬性的位址

//(size_t)就是強轉成size_t型別,因為此時結構體的指標的值是0,強轉成int型,恰巧就是member在結構體的偏移量

#define offscfof(type,member) ((size_t)&((type *)0)->member)

//詳解:對於container_of()函式,

//offscfof(type,member)是該屬性在結構體中的偏移量

//ptr是member屬性在記憶體中的實際位址,為什麼要將ptr強轉成char *型別呢?

//這是由於指標加減的特殊性決定的 比如 (int *)ptr-1,指標會向上移動4個位元組,(char *)ptr-1 指標會向上移動1個位元組

//指標是有步長的,不能是簡單的加減,偏移量就是偏移的位元組數,所以強轉成char *型別正好

#define container_of(ptr,type,member) (type *)((char *)ptr-offscfof(type,member))typedef

struct

_student1student1;

void

main()

C語言中結構體偏移量的計算

一 先來一段理論知識 ansi c標準允許任何值為0的常量被強制轉換成任何一種型別的指標,並且轉換結果是乙個null指標,因此 s 0 的結果就是乙個型別為s 的null指標。如果利用這個null指標來訪問s的成員當然是非法的,但 s 0 m 的意圖並非想訪問s欄位內容,而僅僅是計算當結構體例項的首...

c語言結構體的偏移 c

c語言中關於結構體的位置偏移原則簡單,但經常忘記,做點筆記以是個記憶的好辦法 原則有三個 a.結構體中的所有成員其首位址偏移量必須為器資料型別長度的整數被,其中第乙個成員的首位址偏移量為0,例如,若第二個成員型別為int,則其首位址偏移量必須為4的倍數,否則就要 首部填充 以此類推 b.結構體所佔的...

C 中struct成員的偏移量的計算

c 中,計算struct成員的偏移量,有如下三種方法可用。假設有定義如下 struct st test 現想要求 b 相對於 st test 的偏移位址。1 常用的方法 size t st test 0 b 2 使用stl的定義,要包含 標頭檔案 offsetof st test b offseto...