[英]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.