#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
массив в куче.