嗨,我在 C++ 代码中遇到问题,编译此代码时出现异常错误 [已关闭]

问题描述 投票:0回答:1

我在输入中输入 k 的值作为 1,但值被编辑为 der[5] 的值,执行时为 44。 der[5] 显然是正在编辑 k 的内存位置的数组溢出,任何人都可以解释我这种行为吗 (https://i.stack.imgur.com/pGrxk.png)

我期待编译其他代码有效并且 k 的值发生变化的错误

c++ gcc compiler-errors sublimetext3
1个回答
0
投票

欢迎来到未定义行为之地。

为了提高效率,C++ 假设程序员知道他们在做什么。它可以为每个数组访问添加下标检查,但这会减慢速度。因此,C++ 标准只是声明无效数组访问的结果是未定义的。如果你想搬起石头砸自己的脚,C++ 也不介意。

另一方面,如果您需要验证数组下标,C++ 也有相应的工具。

您应该使用

std::array
std::vector
,而不是内置数组,并使用成员函数
at
,而不是括号下标。请参阅下面的示例。

// main.cpp
#include <array>
#include <iostream>

int get_int(std::string const& prompt)
{
    for (;;) {
        std::cout << prompt;
        if (int n; std::cin >> n)
            return n;
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << "Invalid entry. Please reenter.\n\n";
    }
}
int main()
try {
    int n{ get_int("Enter n: ") };
    int k{ get_int("Enter k: ") };
    std::array<int, 5> der;
    der.at(0) = 1;
    der.at(1) = 2;
    der.at(2) = 3;
    der.at(3) = 4;
    der.at(4) = 5;
    der.at(5) = 44;  // throws
    return 0;
}
catch (std::exception const& e) {
    std::cerr << "Caught exception: " << e.what() << "\n\n";
    return 1;
}
// end file: main.cpp

输出:

Enter n: 2
Enter k: 1
Caught exception: invalid array<T, N> subscript
© www.soinside.com 2019 - 2024. All rights reserved.