GOT*_*O 0 4 c c++ iteration pointer-arithmetic
我经常看到使用普通指针算法的数组迭代,即使在较新的C++代码中也是如此.我不知道它们到底有多安全,如果使用它们是个好主意.考虑这个片段(如果你calloc代替它,它也在C中编译new):
int8_t *buffer = new int8_t[16];
for (int8_t *p = buffer; p < buffer + 16; p++) {
...
}
Run Code Online (Sandbox Code Playgroud)
这种迭代不会导致溢出,并且当buffer 碰巧在地址0xFFFFFFF0(在32位地址空间中)或0xFFFFFFFFFFFFFFF0(64位)分配时,循环会被完全跳过吗?据我所知,这将是一个异常不幸,但仍然可能的情况.
这很安全.C和C++标准明确允许您计算指向一个项目超出数组末尾的指针值,并将指向数组内的指针与该值进行比较.
在您描述的情况下出现溢出问题的实现根本不允许将数组放在内存的末尾.
在实践中,一个更可能的问题是buffer + 16比较等于NULL,但这也是不允许的,一致的实现需要在数组结束后留下空位.
| 归档时间: |
|
| 查看次数: |
1006 次 |
| 最近记录: |