我在输入中输入 k 的值作为 1,但值被编辑为 der[5] 的值,执行时为 44。 der[5] 显然是正在编辑 k 的内存位置的数组溢出,任何人都可以解释我这种行为吗 ()
我期待编译其他代码有效并且 k 的值发生变化的错误
欢迎来到未定义行为之地。
为了提高效率,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