kavinderrana121 Ответов: 1

Ошибка сегментации в cpp в приведенной ниже программе


Я не могу найти правильную причину ошибки сегментации моей программы ,я также не знаю входных данных, в которых она получает ошибку сегментации, потому что я отправляю ее онлайн-судье.
Пожалуйста ,только вы, ребята, можете мне помочь, может быть, вы можете сказать об ошибке, увидев ее один раз.
Я новичок в программировании.Помоги мне...



Я пытался решить очень простую проблему https://www.spoj.com/problems/CANDY/

Это одна из самых решаемых проблем на spoj
Я получаю ошибку сегментации при отправке приведенного ниже решения.
Но в Visual Studio он работает нормально.
Я также объявил переменные, рассматривая размер (sum as long long int)
потому что он может быть большим






1) связано ли это с тем, что я объявляю массив внутри цикла while;
должен ли я объявить этот массив вне цикла while так, чтобы для каждого тестового случая он использовал один и тот же массив

2) является ли каждый раз, когда цикл запускается(для каждого тестового случая), создается новый массив, приведет ли он к сборке мусора или компилятор автоматически освободит память после каждого тестового случая (я знаю о динамическом распределении памяти в этом случае мы должны освободить память явно), можете ли вы сказать мне, в какой области я могу использовать этот массив?
следует ли объявлять переменные?
3)Если мы объявим свежий массив(ы) для каждой итерации цикла while, приведет ли он к мусору до тех пор, пока main не останется в стеке ?



Я получил выше сомнения, потому что ошибка сегментации связана с доступом к памяти.

Что я уже пробовал:

#include<iostream>
 using namespace std;



 int main(){

     while(1){
         int n;
         int arr[10001];
         cin>>n;
         if(n==-1)
             break;
         long long int sum=0;
         for(int i=0;i<n;i++){
             int temp;
             cin>>temp;
             sum+=temp;
             arr[i]=temp;

         }
          int mean=sum/n;
         if((sum%n)!=0){
             cout<<-1<<endl;
             continue;
             }
          int count1=0;
          for(int i=0;i<n;i++){
             if(arr[i]>mean){
                 count1+=(arr[i]-mean);

             }
          }
          cout<<count1<<endl;

     }

 }

1 Ответов

Рейтинг:
9

OriginalGriff

Ошибки сегментации возникают, когда вы пытаетесь получить доступ к памяти, которая не является "Вашей", поэтому вам нужно начать с поиска везде, где используется адрес или указатель.
И это включает в себя индексы массивов, потому что массивы фактически являются указателем (на самом деле имя массива является указателем на первый элемент)

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

И нет, это не сбор мусора - если он не управляется, C++ не использует GC, но ожидает, что вы будете "ответственны" и уберете за собой. Однако в этом случае будет сделано и повторно использовано одно распределение стека, поскольку вы не объявляете свой массив с помощью malloc или new.


kavinderrana121

если я объявлю статический массив внутри основной функции в цикле for, который выполняется n раз, то будут ли n массивов оставаться там до тех пор, пока основная функция не останется в стеке?

OriginalGriff

Нет, он будет создан только один раз. И статический массив не создается в стеке, он выделяется из пула памяти. Данные стека различны, они не находятся в одном и том же месте каждый раз, когда вызывается функция, потому что это зависит от того, когда эта функция вызывается!

kavinderrana121

Если это произойдет ,то будет создано n различных массивов, будет ли лучше, если я выведу свой массив из этого цикла while?
Потому что мы можем использовать один и тот же массив много раз?
И это также сократит используемое пространство?

kavinderrana121

извините я не говорю о статическом ключевом слове static имею в виду здесь что то вроде этого

arr[100] в цикле for

OriginalGriff

Тогда будьте точны в том, что вы говорите! :смеяться:

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

kavinderrana121

Благодарю вас сэр

KarstenK

Избегайте статических помех, когда это возможно. Это означает глобальный и сделать код weired. Если вы действительно явно не подразумеваете "раз и навсегда", то это недостаток дизайна на уровне "серьезной ошибки" ;-)