Пойман фатальный сигнал 11

#c #segmentation-fault

#c #ошибка сегментации

Вопрос:

я получаю фатальный сигнал 11, когда я должен показать первые n простых чисел. я попытался сохранить числа внутри вектора / массива и получить эту ошибку, поймав фатальный сигнал 11

 #include <iostream>

using namespace std;

int main(){
    int n,i=1,a=2,l=1,t,c,p=1;
    t=n;
    cin>>n;
    int v[n];

    for(c=1;c<=t;i  )
    {
        while(a<=i/2 amp;amp; l==1)
        {
            if(i%a==0)
            {
                l=0;
            }
              a;
        }
        if(l==1)
        {
            v[p]=i;t--;
        }

        a=2;l=1;p  ;
    }
    for(p=1;p<=n;p  )
    {
        cout<<v[p]<<" ";
    }
    return 0;
}
  

Комментарии:

1. 🔎🐞Вы просматривали свой код с помощью отладчика , чтобы увидеть, где возникает эта ошибка, а затем запускали его снова, чтобы посмотреть, что происходит до этого момента?

2. int v[n]; Это не стандартный C . Если вам нужен массив с динамическим размером, вам, вероятно, следует использовать std::vector вместо этого.

3. Также индексы массива начинаются с 0 , поэтому for(p=1;p<=n;p ) доступ к массиву выходит за его границы и вызывает неопределенное поведение

4. Также t=n; означает, что t он находится в неопределенном состоянии, поскольку n еще не инициализирован, поэтому for(c=1;c<=t;i ) вызывает неопределенное поведение

5. Я бы также рекомендовал потратить некоторое время на обдумывание лучших имен переменных. В его текущем состоянии этот код нелегко выполнить. И если вы не играете в code golf , бонусные баллы за использование как можно меньшего количества символов не начисляются. Некоторые имена, которые приходят на ум, включают primes , divisor , remainder , max_value_to_check , и т.д. current_index

Ответ №1:

Убитый сигналом 11 / Пойманный фатальный сигнал 11 / Остановленный сигналом 11 возникает, когда возникают проблемы с использованием памяти. Наиболее распространенной причиной является «out of vector» — ссылка на элемент, который не существует в векторе.

Комментарии:

1. Добро пожаловать в Stackoverflow и благодарим вас за ответ. Однако лучшим ответом было бы объяснить, где, по вашему мнению, могла возникнуть эта ошибка, что помогло бы будущим пользователям лучше понять проблемы с показанным здесь кодом, который пытается использовать тип массива C в качестве динамического массива / вектора.