4

即使在较新的 C++ 代码中,我也经常看到使用普通指针算法的数组迭代。我想知道它们到底有多安全,以及使用它们是否是个好主意。考虑这个片段(如果你把它放在 C 中,它也可以编译callocnew

int8_t *buffer = new int8_t[16];
for (int8_t *p = buffer; p < buffer + 16; p++) {
    ...
}

buffer 当碰巧在地址0xFFFFFFF0(在 32 位地址空间中)或0xFFFFFFFFFFFFFFF0(64 位)分配时,这种迭代不会导致溢出并完全跳过循环吗?据我所知,这将是一个非常不走运但仍有可能发生的情况。

4

1 回答 1

6

这是安全的。C 和 C++ 标准明确允许您计算指向数组末尾之外的一项的指针值,并将指向数组内的指针与该值进行比较。

在您描述的情况下存在溢出问题的实现根本不允许像这样将数组放在内存的末尾。

在实践中,一个更可能的问题是buffer + 16比较等于NULL,但这也是不允许的,并且符合要求的实现需要在数组末尾之后留下一个空白位置。

于 2013-10-02T05:13:57.080 回答