gpt4 book ai didi

c++ - 越界访问数组不会出错,为什么?

转载 作者:太空宇宙 更新时间:2023-11-04 04:41:00 25 4
gpt4 key购买 nike

我在 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;
}

程序打印34。这应该是不可能的。我正在使用 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++,并且不能保证它在您下次运行该程序时仍能工作。或者它甚至现在还没有覆盖基本数据,您只是还没有遇到它 将要引起的问题 — 至今。

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

  • 数组是 C 的遗留物。C 数组是您所能得到的最原始的数组。只是一系列具有连续地址的元素。没有边界检查,因为它只是暴露原始内存。在 C 中几乎不可能实现强大的边界检查机制。
  • 在 C++ 中,可以对类类型进行边界检查。但是数组仍然是普通的旧 C 兼容数组。这不是一个类。此外,C++ 还建立在另一条规则之上,这使得边界检查变得不理想。 C++ 的指导原则是“你不用为你不用的东西付费”。如果您的代码是正确的,则不需要边界检查,并且您不应该被迫支付运行时边界检查的开销。
  • 因此 C++ 提供了 std::vector 类模板,它允许两者。 operator[] 旨在提高效率。语言标准不要求它执行边界检查(尽管它也不禁止)。 vector 也有 at() 成员函数,保证执行边界检查。因此,在 C++ 中,如果使用 vector ,则可以两全其美。您无需边界检查即可获得类似数组的性能,并且您可以在需要时使用边界检查访问。

关于c++ - 越界访问数组不会出错,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26552320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com