我在 C++ 程序中分配值超出了这样的范围:
#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;
}
程序打印
3
和 4
.这应该是不可能的。我正在使用 g++ 4.3.3这是编译和运行命令
$ g++ -W -Wall errorRange.cpp -o errorRange
$ ./errorRange
3
4
仅在分配
array[3000]=3000
时它会给我一个段错误吗?如果 gcc 不检查数组边界,我如何确定我的程序是否正确,因为它可能会在以后导致一些严重的问题?
我将上面的代码替换为
vector<int> vint(2);
vint[0] = 0;
vint[1] = 1;
vint[2] = 2;
vint[5] = 5;
cout << vint[2] << endl;
cout << vint[5] << endl;
这一个也不会产生错误。
最佳答案
欢迎每一位 C/C++ 程序员最好的 friend :未定义行为 .
由于各种原因,语言标准没有指定很多内容。这是其中之一。
通常,每当您遇到未定义的行为时,任何事情都可能发生。应用程序可能会崩溃,它可能会卡住,它可能会弹出您的 CD-ROM 驱动器或让恶魔从您的 Nose 里冒出来。它可能会格式化您的硬盘或将您所有的色情内容通过电子邮件发送给您的祖母。
如果你真的不走运,它甚至可能看起来工作正常。
该语言只是说明如果您访问数组边界内的元素会发生什么。如果超出范围会发生什么,这是未定义的。它今天在你的编译器上似乎可以工作,但它不是合法的 C 或 C++,并且不能保证下次运行程序时它仍然可以工作。或者它甚至现在还没有覆盖基本数据,你只是还没有遇到问题,它会导致 - 还没有。
至于为什么没有边界检查,答案有几个方面:
std::vector
类模板,它允许两者。 operator[]
旨在提高效率。语言标准不要求它执行边界检查(尽管它也没有禁止它)。一个 vector 也有 at()
保证执行边界检查的成员函数。所以在 C++ 中,如果你使用 vector ,你会得到两全其美的效果。您可以在没有边界检查的情况下获得类似数组的性能,并且可以在需要时使用边界检查访问。 关于c++ - 越界访问数组不会出错,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64106133/