开发者社区> 问答> 正文

超出范围访问数组不会出错,为什么?

我在C ++程序中分配值,如下所示:

#include using namespace std; int main() { int array[2]; array[0] = 1; array[1] = 2; array[3] = 3; array[4] = 4; cout << array[3] << endl; cout << array[4] << endl; return 0; } 程序将打印3和4。应该是不可能的。我正在使用g ++ 4.3.3

这是编译并运行命令

$ g++ -W -Wall errorRange.cpp -o errorRange $ ./errorRange 3 4 只有在分配时array[3000]=3000,它才会给我带来细分错误。

如果gcc不检查数组边界,我如何确定我的程序是否正确,因为它以后可能会导致一些严重的问题?

我将上面的代码替换为

vector vint(2); vint[0] = 0; vint[1] = 1; vint[2] = 2; vint[5] = 5; cout << vint[2] << endl; cout << vint[5] << endl; 而且这个也不会产生错误。

展开
收起
保持可爱mmm 2020-02-06 23:06:03 484 0
1 条回答
写回答
取消 提交回答
  • 欢迎使用每个C / C ++程序员最好的朋友:Undefined Behavior。

    由于多种原因,语言标准中没有指定很多内容。这就是其中之一。

    通常,每当遇到未定义的行为时,任何事情都可能发生。该应用程序可能会崩溃,可能冻结,可能弹出您的CD-ROM驱动器或使恶魔从您的鼻子中冒出来。它可能会格式化硬盘或将所有色情内容通过电子邮件发送给祖母。

    即使您真的很倒霉,它似乎也可以正常工作。

    该语言只是说如果您访问数组范围内的元素会发生什么。如果您超出范围,将会发生什么,这是不确定的。它现在似乎可以在您的编译器上运行,但是它不是合法的C或C ++,并且不能保证它在下次运行该程序时仍然可以运行。或者说,它并没有被覆盖的基本数据即使是现在,你只是还没有遇到的问题,它是将原因-但。

    至于为什么没有边界检查,答案有两个方面:

    数组是C的剩余物。C数组与原始数组差不多。只是具有连续地址的一系列元素。没有边界检查,因为它只是公开原始内存。在C中几乎不可能实现强大的边界检查机制。 在C ++中,可以在类类型上进行边界检查。但是数组仍然是普通的,与C兼容的数组。这不是一堂课。此外,C ++还建立在另一个使边界检查不理想的规则上。C ++的指导原则是“您不用为不使用的东西付费”。如果您的代码正确,则不需要边界检查,也不必强迫您支付运行时边界检查的开销。 因此,C ++提供了std::vector类模板,两者都允许。operator[]旨在提高效率。语言标准不要求执行边界检查(尽管也不禁止)。向量还具有at()成员函数,该成员函数可以确保执行边界检查。因此,在C ++中,如果使用向量,则可以兼得

    问题来源于stack overflow

    2020-02-07 13:19:09
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载