我在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; 而且这个也不会产生错误。
欢迎使用每个C / C ++程序员最好的朋友:Undefined Behavior。
由于多种原因,语言标准中没有指定很多内容。这就是其中之一。
通常,每当遇到未定义的行为时,任何事情都可能发生。该应用程序可能会崩溃,可能冻结,可能弹出您的CD-ROM驱动器或使恶魔从您的鼻子中冒出来。它可能会格式化硬盘或将所有色情内容通过电子邮件发送给祖母。
即使您真的很倒霉,它似乎也可以正常工作。
该语言只是说如果您访问数组范围内的元素会发生什么。如果您超出范围,将会发生什么,这是不确定的。它现在似乎可以在您的编译器上运行,但是它不是合法的C或C ++,并且不能保证它在下次运行该程序时仍然可以运行。或者说,它并没有被覆盖的基本数据即使是现在,你只是还没有遇到的问题,它是将原因-但。
至于为什么没有边界检查,答案有两个方面:
数组是C的剩余物。C数组与原始数组差不多。只是具有连续地址的一系列元素。没有边界检查,因为它只是公开原始内存。在C中几乎不可能实现强大的边界检查机制。 在C ++中,可以在类类型上进行边界检查。但是数组仍然是普通的,与C兼容的数组。这不是一堂课。此外,C ++还建立在另一个使边界检查不理想的规则上。C ++的指导原则是“您不用为不使用的东西付费”。如果您的代码正确,则不需要边界检查,也不必强迫您支付运行时边界检查的开销。 因此,C ++提供了std::vector类模板,两者都允许。operator[]旨在提高效率。语言标准不要求执行边界检查(尽管也不禁止)。向量还具有at()成员函数,该成员函数可以确保执行边界检查。因此,在C ++中,如果使用向量,则可以兼得
问题来源于stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。