2016-07-14 3 views
0

Я работаю над улучшением своих знаний на C++, и я написал эту программу, чтобы попытаться работать над векторами. Сама программа синтаксически корректна, но когда я компилирую, я получаю SEG FAULT 11. Итак, я запустил Valgrind в коде, и я получаю ошибку invalid write size 4, а также Address 0x0 is not stack'd, malloc'd or (recently) free'd. Вот мой кодНедопустимый размер записи с использованием векторов C++ в адресе 0x0

#include <vector> 
#include <iostream> 
#include <algorithm> 

using namespace std; 

const int TTO = 2147483648; 
int main() 
{ 
    int n, s, p, q, i; 
    cin >> n >> s >> p >> q; 
    vector<int> a; 
    a[0] = s % TTO; 
    for(i = 1; i < n; i++) 
     a[i] = (a[i-1]*p+q) % TTO; 
    sort(a.begin(), a.end()); 
    a.erase(unique(a.begin(), a.end()), a.end()); 
    cout << a.size() << endl; 
    return 0; 
} 

Что я могу сделать, чтобы это не SEG FAULT?

Редактировать: Входной я использовал 3 1 1 1

+0

Я не уверен, что это так, но при вызове * undefined behavior * все может произойти. – MikeCAT

+1

'resize()' ваш вектор перед использованием его здесь: 'a [0]'. –

+0

@ πάνταῥεῖ Как этот 'a.resize()'? –

ответ

3

Ваш вектор не имеет элементов, поэтому доступ даже a[0] является незаконным (точнее, undefined behavior). Дайте вашему вектору начальный размер:

vector<int> a(n); 
      ^^^ 
+0

Спасибо! Я не понимал, что векторам нужен начальный размер. Я пытаюсь лучше отлаживать свой код на C++ и распознавать UB. –

2

Это:

vector<int> a; 

создает пустой вектор, поэтому доступ к любому элементу (включая 0) оператором [] является УБ. Либо позвонить std::vector::resize() или добавлять новые элементы по std::vector::push_back() или std::vector::emplace_back()