将空指针分配给它本身

4

最近我遇到了一段奇怪的代码片段。它是用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赋值给自己?为什么?有什么作用?我理解这行代码的意思是“我们将head视为指向void指针的指针,即void指针的地址。然后我们对其进行解引用,接下来就会得到指向void的指针。然后将该指针分配给head(head指向自身?)”。显然,我错了,因为这是一个成功运行的生产代码示例。但对我来说毫无意义。你们的诀窍是什么?注意:由于NDA,我无法粘贴完整的代码片段。但那里面已经没有什么特别的了。

将“head”指向第一页可能是最重要的。前导的“*”非常重要。 - Mad Physicist
不知道 head 被初始化为什么,就无法确定新值的目的。 - Mad Physicist
@MadPhysicist head=malloc(...) @MadPhysicist head=malloc(...) - Uroboros
2个回答

2

head = *(void**)head; 将指针 (void*) head 指向的地址赋值给了 head 自身。


但是头指向malloc的结果(head = malloc(...)),即一个void*,而不是void** - Uroboros
@Uroboros head指向一个malloc的内存事实并不重要。在head = *(void**)head;之前的某些行可能会将一些void*写入到该malloc的内存块的前sizeof(void*)字节中。 - HolyBlackCat
这是令人难以置信的事实,但却是真实存在的。这就是为什么我被卡住了 :( - Uroboros
@Uroboros 为什么这让你感到难以置信?对我来说听起来并不奇怪。 - HolyBlackCat
没有任何行将空指针写入内存块的前sizeof(void*)字节。这个事实令人难以置信,我的意思是。 - Uroboros
@Uroboros 它必须在那里。也许一些结构被写入了那个内存块中,并且该结构的第一个成员是一个指针? - HolyBlackCat

0
如果head指向一个链表结构,并且链表的第一个元素是指向下一个元素的指针,那么你的结构与之等效。
head = head->next;

当结构体不是不透明的时候。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接