C++ 为什么使用'<=';而不是'<';循环内条件给出分段故障[SIGSEGV]?
在12月份的比赛中,我在解决codechef上的一个问题-。我在代码的某个地方放了一个循环: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,它是
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;isize()
返回一个无符号的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]);