是什么意思`*(unsigned int *)((unsigned int)block + n * i)`

时间:2017-04-11 21:51:00

标签: c++

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;

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

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

2 个答案:

答案 0 :(得分: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,它从头到尾指向下一个元素。尽管上面的演示看起来很简单,但它仍然是代码背后的逻辑。

答案 1 :(得分:0)

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

现在看来,它看起来毫无意义,因为它没有分配任何内存来保存数据以及节点之间的链接(好吧,也许它确实如此 - 也许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;