C+中的向量下标超出范围错误奇怪行为+; 我开始学习C++,所以我的问题的答案可能对你来说是显而易见的,但我真的很困惑。我预计程序在访问超出范围的索引时会崩溃,但相反,程序运行得很好。这是代码 #include <iostream> #include <typeinfo> #include <string> #include <vector> using namespace std; int main() { int x; vector<int> v1; while (cin >> x) { v1.push_back(x); } cout << "out of bound: " << v1[10] << endl; return 0; }

C+中的向量下标超出范围错误奇怪行为+; 我开始学习C++,所以我的问题的答案可能对你来说是显而易见的,但我真的很困惑。我预计程序在访问超出范围的索引时会崩溃,但相反,程序运行得很好。这是代码 #include <iostream> #include <typeinfo> #include <string> #include <vector> using namespace std; int main() { int x; vector<int> v1; while (cin >> x) { v1.push_back(x); } cout << "out of bound: " << v1[10] << endl; return 0; },c++,c++11,C++,C++11,v1中有3个元素,表示没有v1[10],只有v1[0]到v1[2] 这种行为并不奇怪。这就是应该发生的情况,因为std::vector不会对“[]”执行大小检查 所以,你基本上从v1[10]中得到了一个垃圾。谷歌提示:“未定义的行为”。顺便说一句,这并不特别难找到。请下次做更多的研究。阅读文档(和方法)也很有帮助。谢谢大家。如果您在调试模式下编译程序,如果您访问越界向量元素,通常会收到一条诊断消息。OP很清楚那里v1[10]越界并且没有看到错误。这是合法的,但不是“应该发生什么”。我知道没有索引

v1中有3个元素,表示没有v1[10],只有v1[0]到v1[2]

这种行为并不奇怪。这就是应该发生的情况,因为std::vector不会对“[]”执行大小检查


所以,你基本上从v1[10]中得到了一个垃圾。

谷歌提示:“未定义的行为”。顺便说一句,这并不特别难找到。请下次做更多的研究。阅读文档(和方法)也很有帮助。谢谢大家。如果您在调试模式下编译程序,如果您访问越界向量元素,通常会收到一条诊断消息。OP很清楚那里
v1[10]
越界并且没有看到错误。这是合法的,但不是“应该发生什么”。我知道没有索引v1[10],但程序不应该为不存在的索引返回0而崩溃吗?@chris“程序不应该为不存在的索引返回0而崩溃吗?”不,不应该(可以,但这不是必需的),谁告诉过你应该?@chris不,它不应该坠毁。“崩溃”这个词甚至没有出现在C++标准中,在术语中仍然不是特别精确。如果您选择回答相当明显的重复项,那么您最好做好准备,以使您的答案与常见重复目标保持相同的标准,这通常不是很容易达到的。
1 2 3
out of bound: 0