C++ 为什么使用'<=';而不是'<';循环内条件给出分段故障[SIGSEGV]?

C++ 为什么使用'<=';而不是'<';循环内条件给出分段故障[SIGSEGV]?,c++,data-structures,segmentation-fault,runtime-error,C++,Data Structures,Segmentation Fault,Runtime Error,在12月份的比赛中,我在解决codechef上的一个问题-。我在代码的某个地方放了一个循环: for(i=0;i<=(pos.size()-2);i++) { if(pos[i]<0) continue; else if(len<(pos[i]-pos[i+1])) len=pos[i]-abs(pos[i+1]); } 对于(i=0;i如果pos的大小是1,pos.size()-2不等于-1,它是

在12月份的比赛中,我在解决codechef上的一个问题-。我在代码的某个地方放了一个循环:

    for(i=0;i<=(pos.size()-2);i++)
    {
    if(pos[i]<0) 
        continue;
    else if(len<(pos[i]-pos[i+1])) 
        len=pos[i]-abs(pos[i+1]);
    } 

对于(i=0;i如果
pos
的大小是
1
pos.size()-2
不等于
-1
,它是
size\u t
(无符号类型)可以在系统上保持的最大值。因此循环一直运行到
i
是一个非常大的数字

最大数量有一个定义:
SIZE\u MAX
。它通常在现代64位系统上
18446744073709551615


for(i=0;i
size()
返回一个无符号的
size\t
。当size为1时,size-2是一个负数,它会换回一个大的posisibe数。因此,for循环在不应该的时候执行。

size()
是无符号的
size\t
类型,因此
size()-n
所有非零
n
的潜在下溢

由于这种下溢,循环将至少执行一次

i
等于零且
pos.size()
等于1时,
pos[i+1]
的索引是未定义的行为,可能会出现以下故障:

else if(len<(pos[i]-pos[i+1])) 
    len=pos[i]-abs(pos[i+1]);

否则,如果(leni明白你的意思。但是循环在不应该的时候运行不会导致SIGSEGV,对吗?它只会执行很多次,当我超过大小-2时它会崩溃,它试图访问VectorHanks man中不存在的元素。但是由于时间限制,不应该发生TLE而不是SIGSEGV。非常感谢。实际情况在别人的回答评论中问为什么它是SIGSEGV,即使pos.size()-2是一个非常大的数字,这是愚蠢的。我自己应该意识到这一点
else if(len<(pos[i]-pos[i+1])) 
    len=pos[i]-abs(pos[i+1]);