gpt4 book ai didi

c++ - 为什么当我们给超出其大小的数组赋值时没有错误

转载 作者:行者123 更新时间:2023-12-02 17:57:41 25 4
gpt4 key购买 nike

如果a声明一个大小为4的数组并初始化它。
int arr[4]={1,2,3,4}为什么我这样做时没有错误arr[4] =5 或任何其他索引。而数组的大小是 4 。为什么没有错误。这背后的逻辑是什么???

我知道没有错误。但我无法理解这背后的逻辑。

最佳答案

与其他一些语言相反,C++ 不执行任何运行时边界检查,正如您所观察到的。数组的大小实际上并不存储在任何地方,并且在运行时不可用。因此,在运行时无法执行此类检查。这是语言创建者有意识的选择,目的是使语言尽可能快,同时仍然能够选择使用我在下面概述的解决方案进行边界检查。

相反,发生的情况被称为未定义行为,C++ 中有很多这样的行为。必须始终避免这种情况,因为结果无法保证,并且每次运行程序时结果都可能不同。它可能会覆盖其他内容,可能会崩溃等。

这里有几个解决方案路径:

  1. 最常见的是,您会希望使用 std::array 以便可以访问其 .size(),然后在访问之前检查它:

    if (i < arr.size())
    arr[i] = value;
    else // handle error
  2. 如果您想处理错误,可以使用 std::array 及其 .at() 方法,该方法将抛出 std::out_of_range 如果索引超出范围:https://en.cppreference.com/w/cpp/container/array/at

    示例:http://coliru.stacked-crooked.com/a/b90cbd04ce68fac4 (确保您使用 C++ 17 运行示例中的代码)。

  3. 如果您只需要进行边界检查以进行调试,您可以在编译器中启用该选项,例如 GCC STL bound checking (这还需要使用 std::array)

关于c++ - 为什么当我们给超出其大小的数组赋值时没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75318783/

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