Почему, начиная с l oop при i = 1, я получаю ошибку сегментации в этой векторной задаче? - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь создать массив переменного размера, который поможет мне хранить значения и позволит мне получать и распечатывать значение по запросу. Я действительно выполнил эту задачу, но поскольку я новичок в кодировании, я просто хотел спросить, почему использование for l oop, начиная с i = 1 до i <= n, дает мне ошибку сегментации? </p>

#include<iostream>
#include<vector>
using namespace std;
int main()
{

    int n, n1, data, q1, q2, q; /*n is number of variable length arrays and q is queries*/
    cin>>n>>q;
    vector< vector<int> > a(n); //vector as suited for to take input in number of arrays required
    for(int i=1;i<=n;i++)
    {
        cin>>n1; //number of element in first array index
        for(int j=1;j<=n1;j++)
        {
            cin>>data;
            a[i].push_back(data);
        }
    }
    for(int i=1;i<=q;i++)
    {
        cin>>q1>>q2; /*taking input queries as array index and then inside that second query pointing to variable array elements*/
        cout<<a[q1][q2]<<endl;
    }
    return 0;
}

Ответы [ 2 ]

4 голосов
/ 02 августа 2020

Когда вы объявляете vector следующим образом:

vector< vector<int> > a(n);

, он имеет размер n. Индексирование в C ++ (и, по сути, в большинстве языков программирования) начинается с 0 и продолжается до n-1.

Если вы индексируете vector размером n с индексом n (как вы это делаете в своем for l oop), это индекс за пределами границ и вызывает неопределенное поведение. Результатом неопределенного поведения является то, что программа может делать все, что угодно, . Ошибка сегментации на самом деле является хорошим результатом, поскольку вы можете исправить ошибку до того, как произойдет что-нибудь слишком неприятное.

Вы также можете попробовать выполнить индексацию в вектор с помощью .at(). Это тоже неправильно, но ошибочно другого рода; это определенное поведение, и определено, что оно генерирует исключение std::out_of_range, сообщающее вам, что именно вы сделали неправильно.

0 голосов
/ 02 августа 2020

Когда вы впервые объявили вектор, вы дали ему n элементов, от 0 до n - 1. Однако в вашем for l oop i может достигать n, что вызывает ошибку сегментации (или векторный индекс вне допустимого диапазона) при попытке изменить a[i], поскольку он еще не существует.

...