使用offsetof編寫鏈結構

2021-05-21 21:10:42 字數 774 閱讀 3698

在c中,要實現乙個通用的雙向鍊錶,我們一般的做法是這樣定義節點結構:

struct node

;也就是資料和節點是分開的,資料單獨指向一塊記憶體,這樣在記憶體上有點不爽,我們希望資料和節點鏈域是緊密存放的,這樣乙個節點記憶體只分配一次,可是c中沒有泛型,怎麼讓不同資料型別與鏈域緊密存放呢?

offsetof為我們提供了這樣的做法。

offsetof是個巨集,之處結構體中某成員的偏移位置。

#define offset(struct_t,member) ((size_t)(char*)((struct_t*)0)->member)

現在我們這樣定義鍊錶節點:

struct link

;怎麼只有鏈域,沒有資料?

別擔心,事實上我們把資料存在如下結構中:

struct node

;這樣資料和鏈域緊密存放,只是鍊錶中僅儲存link位址,當需要訪問資料時我們可以從link位址減去link在node中的偏移位置offsetof(struct node, struct link)從而得到資料指標。

結構示意如下:

這種做法保證了資料與鏈域的緊密。不僅用於鍊錶,所有鏈資料結構如二叉樹也可以使用offsetof方式編寫。

此外還有一種保證緊密性的鏈結構做法,定義結構如下:

struct item

struct item *next;

char c;

鏈域在前資料在後,在分配具體節點時分配sizeof(struct item) + sizeof(struct data_t) - 1的大小。

區塊鏈結構

位元幣是乙個專用資料庫,它只儲存一種型別的資料記錄 交易,例如 張三轉給李四幾個幣,或者李四轉給王五幾個幣 一旦涉及到資金,大家都會變得慎重了。因此交易記錄最好在技術上可以保證 是不能篡改的,這樣出了問題可以翻翻老賬,這就要求賬本必須值得信賴。位元幣採用一種特殊的資料結構區塊鏈 blockchain...

原型鏈結構

看圖之前我們首先來了解幾個物件原型的基本知識 例子 function fn fn為建構函式 var f1 new fn f1是fn建構函式建立出來的物件 建構函式的prototype屬性值就是物件原型。fn.prototype就是物件的原型 建構函式的prototype屬性值的型別就是物件 type...

動態鏈結庫的編寫及使用(c )

一 編寫動態鏈結庫 mydll.cpp dll的入口點 bool apientry dllmain handle hmodule,dword ul reason for call,lpvoid lpreserved return true int myadd int a,int b int stdc...