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

Pra*_*dia 0 c++ error-handling vector 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]);
}
Run Code Online (Sandbox Code Playgroud)

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

为什么会发生?

Som*_*ude 5

问题是你的循环:

 for(int i = 0; i < v.size() -1;++i)
Run Code Online (Sandbox Code Playgroud)

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

size函数返回一个 type 值size_type,如果您阅读例如vector引用将看到它是一个无符号类型。

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

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