“*(无符号整数*)((无符号整数)块 + n*i)”是什么意思

what is meaning of `*(unsigned int*)((unsigned int)block + n*i)`

本文关键字:无符号整数 是什么 意思      更新时间:2023-10-16
void* block = ::operator new(n*size);
int i;
for(i = 0;i<BLOCK_SIZE -1;i++){
    *(unsigned int*)((unsigned int)block + n*i) = (unsigned int)block + n*(1+i);
}
*(unsigned int*)((unsigned int)block + n*i) = 0;

问题>我无法理解上述代码的含义。似乎一个内存块指向下一个块内存。

有人可以向我解释一下吗?

block[0] = &block[1]
block[1] = &block[2]
block[2] = &block[3]
.
.
.
block[n] = 0  // dereferenced so not NULL, assigned zero as a value

AFAIS,它从头到尾指向下一个元素。尽管上面的演示看起来很简单,但它是代码背后的逻辑。

你已经得到了它几乎是正确的 - 它分配一个内存块,然后将其视为多个节点,并将它们作为链表链接在一起。

就目前而言,它看起来毫无意义,因为它没有分配任何内存来保存数据以及节点之间的链接(好吧,也许它确实如此 - 也许n实际上大于sizeof(unsigned *)并且size大于BLOCK_SIZE,因此它可以容纳更大的项目(。

如果我要做这样的事情,我可能会写更像这样的代码:

unsigned *block = (unsigned *)::operator new(n*size);
for (size_t i=0; i<size-2; i++)
    block[i] = &block[i+1];
block[size-1] = nullptr;

当然,缺乏这样做的理由,这也是非常值得怀疑的 - 大多数代码可能都可以像这样的东西:

std::vector<unsigned *> block(size);
for (int i=0; i<size-2; i++)
    block[i] = &block[i+1];
block[size-1] = 0;