container of與offsetof的原理

2021-06-20 18:44:26 字數 615 閱讀 9912

container_of是linux核心中使用非常頻繁的乙個巨集,用於從包含在某個結構中的指標獲得結構本身的指標,通俗地講就是通過結構體變數中某個成員的首位址進而獲得整個結構體變數的首位址。

#define container_of(ptr, type, member) ()

其中offsetof的定義:

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

該巨集用於求結構體中乙個成員在該結構體中的偏移量。

如:typedef struct test_s test_s;

則offsetof(test_s, c)的值為8,即結構體test_s中成員c相對於結構體首位址的偏移量為8.

例子:test_s test;

printf("%x\n",&test);

printf("%x\n", &test.c);

printf("%x\n", container_of(&test.c,test_s,c));

輸出ffbef940

ffbef948

ffbef940

即&test和container_of(&test.c,test_s,c)是相同的

offsetof與container of巨集解析

1 前言 今天在看 時,遇到offsetof和container of兩個巨集,覺得很有意思,功能很強大。offsetof是用來判斷結構體中成員的偏移位置,container of巨集用來根據成員的位址來獲取結構體的位址。兩個巨集設計的很巧妙,值得學習。linux核心中有著兩個巨集的定義,並在鍊錶結...

offsetof與container of巨集舉例

一 在linux kernel中關於offsetof與container of巨集的定義為 二 offsetof巨集介紹 b.offsetof巨集的原理 我們虛擬乙個type型別結構體變數,然後用type.member的方式來訪問那個member元素,繼而得到 member相對於整個變數首位址的偏移...

container of巨集定義

1 container of在linux核心中是乙個常用的巨集,用於從包含在某個結構中的指標獲得結構本身的指標,通俗地講就是通過結構體變數中某個成員的首位址進而獲得整個結構體變數的首位址。2 介面 container of ptr,type,member ptr 表示結構體中member的位址 ty...