2010-06-03 73 views
1

崩潰,我有這個簡單的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; 
} 

但在運行時它崩潰了,所以我就用「發送錯誤報告」和「不發送」的錯誤。我做錯了什麼?謝謝!

+2

如果它在任何其他時間墜毀,這將是有趣的。 – 2010-06-05 19:40:28

回答

1

aleator()返回1和n之間的數字,包括1和n。但是,這意味着它可能會返回100,這在indexes[]的範圍之外。

所以擺脫+1aleator()

此外,您的矢量v大小爲零。除非v[index]存在,否則您不能要求v[index] ...

1

您從空白矢量讀取,如dreamlax所述。 aleator在[1,100]中返回一個值,但有效索引在[0,99]中。這兩種都可能導致未定義的行爲。

要獲得額外的功勞,請計算aleator bug在程序運行中至少會導致一個緩衝區溢出的概率。

4

您的向量v從未使用任何數據填充,但您嘗試訪問它的元素。此外,你的隨機數發生器產生錯誤的整數範圍。您希望它生成0到99之間的整數,但它會生成1到100之間的整數。

0

該程序在cout << v[index]處發生分段衝突時崩潰。將此行更改爲cout << v.at(index)後,它會以std :: out_of_range中止,因此索引超出範圍。

+0

感謝您的建議。現在它工作:) – qwerty 2010-06-03 09:53:14

0

此外,作爲一個側面說明,爲什麼您使用<cstdlib>和< stdlib.h中>和<文件math.h >而不是CMATH等。是否真的需要混合使用C和C++頭文件?