繁体   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