Ошибка ошибки сегментации C при сохранении целых чисел в виде массивов int

#c #arrays #segmentation-fault

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

Вопрос:

У меня ошибка ошибки сегментации, и я не уверен, почему: у меня есть этот код: entierlong.h

 const int MAXCHIFFRES = 1000;

typedef int tabEnt[MAXCHIFFRES];

struct EntierLong
{
    bool Negatif;
    tabEnt Chiffres;
};
  
 EntierLong addition(EntierLong n1, EntierLong n2)
{
  int retenue,somme,i;
  n3 = Convertir(0);
  if (n1.Negatif != n2.Negatif)
  {
    cout<<"Les entierslongs doivent être de même signe.n";
    return(n3);
  }
  n3.Negatif = n1.Negatif;
  retenue = 0;
  for(i=0;i<=MAXCHIFFRES-1;i  )
  {
    somme = n1.Chiffres[i] n2.Chiffres[i] retenue;
    retenue = int(somme>=10);
    n3.Chiffres[i]=somme-retenue*10;
  }
  return(n3);
}

EntierLong Un_2=Convertir(0), Un_1=Convertir(1), Un=Convertir(0);
EntierLong fibonnaci(int n)
{
    int i=0;
    switch(n)
    {
        case 0:
            return(Un_2);
            break;
        case 1:
            return(Un_1);
            break;
    }
    for(i=2;i<=n;i  )
    {
        Un=addition(Un_2,Un_1);
        Un_2 = Un_1;
        Un_1 = Un;
    }
    return(Un);
}
  

По сути, я сохраняю целое число в массиве integer для вычисления больших чисел fibonnaci
, все работает нормально, пока я не увеличу MAXCHIFFRES значение выше 1000
Это дает мне Segmentation fault: 11
Насколько я понимаю, в какой-то момент моя куча переполнена
Я пытался поместить определения вне функций, чтобы устранить эту проблему, но безрезультатно.

Чего я не понимаю, так это того, что суммирование двух EntierLong элементов работает с моей функцией. Я очень новичок в cpp, поэтому, пожалуйста, дайте мне знать, если мой вопрос задан неправильно, заранее спасибо

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

1. n3 не определен

2. Вероятно, вы выделяете слишком много памяти в стеке.

3. Это была проблема @Zaiborg, другая функция, называемая массивом массивов. Я решил ее с помощью static определения.

4. Вы должны окончательно взглянуть на стандартные контейнеры c (см. Мой Ответ) для выделения. C без контейнера на самом деле не является скачком от «старого доброго C». Выделение в куче нормально, если вам не нужно слишком много памяти.

5. Проблема, с которой я сталкиваюсь с вашим решением, заключается в том, что структура была передана мне во время назначения, и мне не разрешили ее изменить. Однако я бы определенно сделал это по-своему за пределами школы.

Ответ №1:

Если у вас возникли проблемы с выделением памяти, вы можете заменить свой EntierLong тип на

 struct EntierLong
{
    bool Negatif;
    std::vector<int> Chiffres;
    EntierLong()
    {
        Chiffres.resize(MAXCHIFFRES,0);
    }
};
  

Конструктор выделит Chiffres массив в куче.