首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >访问超出界限的数组不会出错,为什么?

访问超出界限的数组不会出错,为什么?
EN

Stack Overflow用户
提问于 2018-03-27 06:28:23
回答 2查看 0关注 0票数 0

我在C++程序中将值赋值超出了这样的范围:

代码语言:txt
复制
#include <iostream>
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;
}

程序打印34。这是不可能的。我正在使用g++4.3.3

下面是编译和运行命令

代码语言:txt
复制
$ g++ -W -Wall errorRange.cpp -o errorRange
$ ./errorRange
3
4

只有在分配时array[3000]=3000会不会给我一个分割错误。

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

我将上面的代码替换为

代码语言:txt
复制
vector<int> vint(2);
vint[0] = 0;
vint[1] = 1;
vint[2] = 2;
vint[5] = 5;
cout << vint[2] << endl;
cout << vint[5] << endl;

这个也不会产生错误。

EN

Stack Overflow用户

发布于 2018-03-27 15:02:18

欢迎来到每一个C/C++程序员最好的朋友:未定义行为

语言标准中有很多没有具体规定,原因很多。这是其中之一。

通常,每当遇到未定义的行为时,什么都行可能会发生。应用程序可能崩溃,它可能冻结,它可能弹出你的光盘驱动器或使恶魔从你的鼻子出来。它可能会格式化你的硬盘或电子邮件你所有的色情给你的祖母。

如果你真的不走运的话,出现才能正常工作。

语言只是简单地说明了如果您访问元素应该发生什么。数组的边界。如果你出界了,会发生什么,这是一个未知数。可能看上去今天,在编译器上工作,但这并不是合法的C或C++,也不能保证下次运行程序时它仍能工作。或者说它现在还没有覆盖基本数据,而只是没有遇到问题会导致-现在。

至于何必没有边界检查,答案有几个方面:

  • 数组是C语言的剩余物,C数组是你所能得到的最原始的。只是一个具有连续地址的元素序列。没有边界检查,因为它只是公开原始内存。在C语言中,几乎不可能实现健壮的边界检查机制。
  • 在C++中,可以对类类型进行边界检查.。但是数组仍然是一个简单的C兼容的数组。这不是一门课。此外,C++还建立在另一条规则之上--检查不理想。C++的指导原则是“不为不使用的东西付费”。如果代码是正确的,则不需要边界检查,也不应该被迫支付运行时边界检查的开销。
  • 所以C++提供了std::vector类模板,这允许两者都使用。operator[]是为了提高效率。语言标准不要求它执行边界检查(尽管它也不禁止)。向量还具有at()成员函数执行边界检查。所以在C++中,如果你使用一个向量,你就可以得到两个世界的最佳结果。你可以得到类似数组的性能,你可以在你想要的时候使用边界检查访问。
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档