C++ Visual Studio C+出现奇怪的边界错误+;

C++ Visual Studio C+出现奇怪的边界错误+;,c++,loops,visual-studio-2012,C++,Loops,Visual Studio 2012,我在Visual Studio中为一个班级项目工作。因为我再也无法判断自己是否疯了,所以这段代码会运行并立即导致“索引超出范围”错误。在我的脑海里,这不可能发生 int _tmain(int argc, _TCHAR* argv[]){ vector<int> points; for(int i = 0; i < points.size() - 1; i++){ points[i+1] = 2; return 0; } int-tmai

我在Visual Studio中为一个班级项目工作。因为我再也无法判断自己是否疯了,所以这段代码会运行并立即导致“索引超出范围”错误。在我的脑海里,这不可能发生

int _tmain(int argc, _TCHAR* argv[]){
    vector<int> points;
    for(int i = 0; i < points.size() - 1; i++){
        points[i+1] = 2;
    return 0;
}
int-tmain(int-argc,_-TCHAR*argv[]{
矢量点;
对于(int i=0;i
向量中没有值,因此大小返回为0,我们正在检查i是否小于-1。0是否小于-1?不,不是这样,循环永远不会运行,程序应该返回

我得到的确切警告是:


我正在为调试模式编译,所以我想我的问题是,首先,我是否遗漏了什么?如果没有,这是否是某种奇怪的Visual Studio调试功能?

以下是导致问题的表达式:

i < points.size() - 1
i + 1 < points.size()

它在数学上是相同的,但它不会产生数字溢出,除非
i
处于
int
的最大值以下是导致问题的表达式:

i < points.size() - 1
i + 1 < points.size()

它在数学上是相同的,但它不会产生数字溢出,除非
i
处于
int

的最大值,而不是像您当前这样运行for循环:

for(int i = 0; i < points.size() - 1; i++)
for(int i=0;i
您可能希望首先使用if语句,然后在其中嵌套循环,如下所示:

if (points.size() >= 0)
  for(int i = 0; i < points.size(); i++)
if(points.size()>=0)
对于(int i=0;i
而不是为此运行for循环,就像您当前所做的那样:

for(int i = 0; i < points.size() - 1; i++)
for(int i=0;i
您可能希望首先使用if语句,然后在其中嵌套循环,如下所示:

if (points.size() >= 0)
  for(int i = 0; i < points.size(); i++)
if(points.size()>=0)
对于(int i=0;i
您需要
为向量保留一个大小,这样它就知道有内存供您访问;或者使用
向后推
将项目放入向量中

使用
推回
矢量点;
常量无符号整数最大值=42;
对于(int i=0;i<最大值;i++)
{
点。推回(2);
}
预留空间:
const unsigned int max_points=42;
矢量点(最大_点);
对于(int i=0;i<最大值;i++)
{
点[i]=2;
}

您需要
为向量保留一个大小,这样它就知道有内存供您访问;或者使用
向后推
将项目放入向量中

使用
推回
矢量点;
常量无符号整数最大值=42;
对于(int i=0;i<最大值;i++)
{
点。推回(2);
}
预留空间:
const unsigned int max_points=42;
矢量点(最大_点);
对于(int i=0;i<最大值;i++)
{
点[i]=2;
}

您缺少一个右括号
点。size()
未签名,因此
点。size()-1
在size为0时下溢。不幸的是,只有在这个版本中才存在右括号问题,这就是,谢谢您的回答!@sleutheye您缺少一个右括号
点。size()
未签名,因此
点。size()-1
当大小为0时下溢。不幸的是,只有在这个版本中才存在右括号问题。那么,谢谢你的回答!@SleuthEye