我有以下代码用于整数向量的向量(即整数矩阵..)
vector<vector<int> > scores (3, vector<int>(2,0));
cout<<scores[1][5];
这不会给出EXC_BAD_ACCESS,但这样做:
cout<<scores[5][1];
为什么行为不同?
只是为了澄清:这不是特定于给出的示例数字。当内部维度超出界限时,永远不会出现错误,对于外部维度则不然。
答案 0 :(得分:6)
无论哪种方式,访问越界都是未定义的行为。
所以任何事都可以发生。只是“发生”一个案件崩溃而另一个案件没有崩溃。
至于为什么第一种情况不会崩溃而第二种情况在你的特定情况下会发生,第一种情况大多只是将数据读取到垃圾堆内存中。
但在第二种情况下,您正在访问错误的vector
对象。由于vector
对象只是指针的包装器,因此在第二个索引上取消引用该(坏)指针将会崩溃。
答案 1 :(得分:1)
理论上两者都不应该工作,但是,operator[]
不需要检查边界访问(at()
是)。因此调用scores[1][5]
进入未定义的行为区域,在这种情况下不幸的是不会导致崩溃。它只是“C / C ++中未定义的行为可以做任何事情”原则的另一个应用。
答案 2 :(得分:0)
如果违反规则,你无法保证会发生什么。有时它会是一件事,有时甚至是另一件事。这就是遵循规则很重要的原因。它们是给你可预测行为的东西。
如果你保持在速度限制之下,你永远不会被超速驾驶。如果你超过极限,有时你会被拉过来,有时你却没有。