vector.size()在比较中意外工作

时间:2018-10-20 14:19:45

标签: c++ vector error-handling segmentation-fault

当我在比较中使用vector.size()时,会产生意想不到的结果

vector<int> v;
for(int i = 0; i < v.size() -1;++i){
    printf("i = %d\n", i);
    printf("v[i] = %d\n", v[i]);
}

由于向量的大小为0,因此它不打印任何内容,但进入循环并打印i = 0并给出分割错误。但是它甚至不应该进入for循环,因为v.size() - 1-1

为什么会这样?

2 个答案:

答案 0 :(得分:4)

问题出在你的循环中

 for(int i = 0; i < v.size() -1;++i)

更具体地说,这部分条件是:v.size() - 1

size函数返回类型为size_type的值,如果您读取例如this vector reference将看到是 unsigned 类型。

这意味着当您从值1中减去0时,您不会得到-1,而是会得到一个非常大的值,因为无符号下溢会回绕到其最大值。 / p>

这意味着您的循环确实会至少迭代一次,并在超出索引范围时导致UB(未定义行为)。

答案 1 :(得分:1)

向量大小是无符号整数,因此v.size()-1永远不会为-1,而是一些非常大的整数。