铸造void **并将第一个字节设置为nullptr?

时间:2018-08-04 21:54:52

标签: c++ casting

在块分配器中,我刚遇到了这种模式。它可能是用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而且我是否可以只进行chunk = NULL而无需强制转换,因为operator[]只是将void**取消引用为void*(/ edit:不要做大块= NULL)

1 个答案:

答案 0 :(得分:2)

chunk = NULL会将您刚刚分配的指针设置为NULL。

*chunk = NULL无效,您不能取消引用空指针。

((void**)chunk)将指针强制转换为指针数组,((void**)chunk)[0] = NULL将该数组的第一个元素设置为NULL(或将分配的内存的第一个sizeof(void *)字节设置为0)。

memset(chunk, 0, sizeof(void*))是获得相同结果的另一种方法。