我经常看到使用普通指针算法的数组迭代,即使在较新的C ++代码中也是如此。我不知道它们到底有多安全,如果使用它们是个好主意。考虑一下这个片段(如果你用calloc
代替new
,它也会在C中编译):
int8_t *buffer = new int8_t[16];
for (int8_t *p = buffer; p < buffer + 16; p++) {
...
}
当buffer
发生以便在地址0xFFFFFFF0
分配时,这种迭代不会导致溢出并且循环被完全跳过(在32位地址中)空格)还是0xFFFFFFFFFFFFFFF0
(64位)?
据我所知,这将是一个非常不幸的,但仍然可能的情况。
答案 0 :(得分:6)
这是安全的。 C和C ++标准明确允许您计算指向一个项目超出数组末尾的指针值,并将指向数组的指针与该值进行比较。
在您描述的情况下出现溢出问题的实现根本不允许将数组放在内存的末尾。
在实践中,更可能的问题是buffer + 16
比较等于NULL
,但是这也是不允许的,并且符合实现需要在数组结束后留下空位。