簡體   English   中英

如何在C中取消引用void *?

[英]How can I dereference a void* in C?

我有一個稱為binsvoid*數組。 每個void*指向一個chunk

大塊

每個塊都由三個事物組成,它們在連續的內存中一個接一個地排列:

  1. 塊的字節大小。 這由uint32_t表示。
  2. 下一個有效塊的地址。 這由void*表示。
  3. 塊的數據。 出於所有目的和目的,這是垃圾,可以忽略。

我想做的事

我的算法是這樣的:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM