在块分配器中,我刚遇到了这种模式。它可能是用C语言编写的,但我使用的是C ++ 17。
...
void * chunk = malloc(size);
((void**)chunk)[0] = NULL; // ???
if (last_chunk != NULL) {
((void**)last_chunk)[0] = chunk;
else {
first_chunk = chunk;
}
在这种情况下,为什么要强制转换为void**
并将第一个字节设置为NULL
? 而且我是否可以只进行(/ edit:不要做大块= NULL)chunk = NULL
而无需强制转换,因为operator[]
只是将void**
取消引用为void*
?
答案 0 :(得分:2)
chunk = NULL
会将您刚刚分配的指针设置为NULL。
*chunk = NULL
无效,您不能取消引用空指针。
((void**)chunk)
将指针强制转换为指针数组,((void**)chunk)[0] = NULL
将该数组的第一个元素设置为NULL
(或将分配的内存的第一个sizeof(void *)字节设置为0)。
memset(chunk, 0, sizeof(void*))
是获得相同结果的另一种方法。