2010-06-03 2 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

Было бы интересно, если бы он разбился в любое другое время. –

ответ

1

aleator() возвращает число от 1 до n включительно. Однако это означает, что он может вернуть 100, что выходит за пределы indexes[].

Так что избавитесь от +1 в aleator().

Кроме того, ваш вектор v имеет размер 0. Вы не можете запросить v[index], если только v[index] не существует ...

1

Вы читаете из пустого вектора, как отмечено dreamlax. aleator возвращает значение в [1, 100], но действительные индексы находятся в [0, 99]. Оба они могут вызвать неопределенное поведение.

Для получения дополнительной оценки вычислите вероятность того, что ошибка слияния приведет к по меньшей мере одному переполнению буфера при прогоне программы.

4

Ваш вектор v никогда не заселен никакими данными, но вы пытаетесь получить от него элементы. Кроме того, ваш генератор случайных чисел создает неправильный диапазон целых чисел. Вы хотите, чтобы он производил целые числа от 0 до 99, но он производит целые числа от 1 до 100.

0

Программа вылетает с нарушением сегментации на cout << v[index]. После изменения этой строки на cout << v.at(index) она прерывается с помощью std :: out_of_range, поэтому индекс выходит за пределы.

+0

Спасибо за предложения. теперь это работает :) – qwerty

0

Кроме того, в качестве побочного сведению, почему вы используете <cstdlib> и <stdlib.h> и <math.h> вместо CMATH и так далее. Есть ли необходимость комбинировать заголовки C и C++?

Смежные вопросы