我有这个简单的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;
}
但是在运行时它会崩溃,所以我在“发送错误报告”和“不发送”时遇到了错误。我做错了什么?谢谢!
答案 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 ++标题?