C ++程序在运行时崩溃

时间:2010-06-03 09:36:06

标签: c++

我有这个简单的c ++程序

 #include <cstdlib>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <vector>

using namespace std;
int aleator(int n) 
{
    return (rand()%n)+1;
}
int main() 
{
    int r;
    int indexes[100]={0};
  //  const int size=100;
    //int a[size];
    std::vector<int>v;
    srand(time(0)); 
    for (int i=0;i<25;i++) 
    {
     int index = aleator(100);
     if (indexes[index] != 0)      
    {
        // try again
         i--;
         continue;
     }
    indexes[index] = 1;
    cout << v[index] ;
    } 
    cout<<" "<<endl;
    system("pause");
    return 0;
}

但是在运行时它会崩溃,所以我在“发送错误报告”和“不发送”时遇到了错误。我做错了什么?谢谢!

5 个答案:

答案 0 :(得分:4)

您的向量v永远不会填充任何数据,但您尝试从中访问元素。此外,您的随机数生成器生成错误的整数范围。你希望它产生从0到99的整数,但它产生的整数从1到100。

答案 1 :(得分:1)

你从空载体中读取,如dreamlax所述。 aleator返回[1,100]中的值,但有效索引在[0,99]中。这两种都可能导致不确定的行为。

要获得额外的功劳,请计算执行程序错误在程序运行中至少导致一个缓冲区溢出的概率。

答案 2 :(得分:1)

aleator()返回介于1和n之间的数字。但是,这意味着它可能返回100,这超出了indexes[]的范围。

所以摆脱+1中的aleator()

此外,您的向量v的大小为零。除非v[index]存在,否则您无法要求v[index]

答案 3 :(得分:0)

程序因cout << v[index]的分段违规而崩溃。将此行更改为cout << v.at(index)后,它将使用std :: out_of_range中止,因此索引超出范围。

答案 4 :(得分:0)

另外,作为旁注,你为什么要使用&lt; cstdlib&gt;和&lt; stdlib.h&gt;和&lt; math.h&gt;而不是cmath等。是否真的需要混合C和C ++标题?