[英]How can I dereference a void* in C?
我有一個稱為bins
的void*
數組。 每個void*
指向一個chunk 。
每個塊都由三個事物組成,它們在連續的內存中一個接一個地排列:
uint32_t
表示。 void*
表示。 我的算法是這樣的:
if bins[index] == NULL: foo()
otherwise:
save the address of this chunk (it is bins[index])
get the address of the next chunk
set bins[index] to the address of the next chunk
return the original value bins[index] that we saved
獲取下一個塊的地址時遇到很多麻煩。 現在,我的實現可以用了,但是很麻煩:
void* next = (void*)*(uint64_t*)(bin[index] + sizeof(uint32_t));
主要問題是在取消引用地址之前將地址bin[index] + sizeof(uint32_t)
轉換為uint64_t
。 有什么辦法可以像引用地址或指針一樣取消引用它嗎?
您可以定義一個具有2個成員的結構並強制轉換指針:
struct chunk_head {
uint32_t size;
void *next;
};
void *next = ((struct chunk_head*)bins[index])->next;
假定void*
在32位上對齊。
一種更直接但不易理解的方式是:
void *next = *(void**)((uint64_t*)bins[index] + 1);
您的方法是不可移植的,因為它依賴作gcc擴展的void*
算法。 標准C不允許將數字加到void*
。 還要注意,您讀取了指向uint32_t
的指針並將其轉換為void*
,這與將地址轉換為void**
並取消引用以讀取void*
指針並不完全相同:
void *next = *(void**)(bin[index] + sizeof(uint32_t)); // gcc extension
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.