最近,我遇到了一个奇怪的代码段。它是用C编写的内存池代码的一部分,(当然)大量使用地址算法。
我省略了多余的细节,而不是添加了一些评论:
void *head;
/* some memory allocation stuff, including assigning allocated memory address to head */
/* allocating some memory pages */
/* OK, now allocation stuff is finished. head pointer still contains valid address */
head = *(void **)head;
什么是head = *(void **)head;
?我们把头分配给自己吗?为什么?为了什么我将此行理解为“,我们将head当作指向void的指针,即void指针的地址。然后我们对其进行解引用,因此接下来我们将获得指向void的指针。然后将这个指针分配给head (直接前往??)”。。
很显然,我错了,因为它可以成功运行生产代码示例。但这对我来说没有任何意义。伙计,这是什么把戏?
P.S。不幸的是,由于NDA,我无法粘贴完整的代码段。但是那里没有什么特别的了。
答案 0 :(得分:2)
head = *(void**)head;
分配一个指针void*
指向head
本身的指针(head
)。
答案 1 :(得分:0)
如果head
指向链接列表结构,并且链接列表的第一个元素是指向下一个元素的指针,则您的构造等效于
head = head->next;
结构不透明时。