#c #arrays #data-structures #segmentation-fault #indexoutofboundsexception
#c #массивы #структуры данных #ошибка сегментации #исключение indexoutofboundsexception
Вопрос:
Я получал эту ошибку сегментации во многих проблемах, которые я решаю в онлайн-среде разработки, но не могу полностью понять эту проблему и, таким образом, решить ее. Пожалуйста, помогите мне с тем же.
Я понимаю, что иногда это может произойти из-за переполнения стека, поэтому я должен использовать память кучи. Но как это сделать?
Одним из примеров этого кода является поиск факториалов с большими числами
Код
// calculate factorial of really large numbers
#include<iostream>
using namespace std;
#define MAX 500
int multiply(int arr[], int x, int len)
{
int carry = 0;
int i = 0;
int temp = 0;
for(; i < len; i )
{
// multiply each digit w the number x and store the carry to be added in the next number
temp = 0;
temp = x * arr[i] carry;
arr[i] = (temp%10);
carry = temp/10;
}
// if end carry is also generated, even that has to be accomodated in the ans
while(carry != 0) //18 === 8 1
{
temp = carry%10;
carry /= 10;
arr[i] = temp;
len ;
i ;
}
// final length of the number is returned so that it can be printed easily
return len;
}
void factorial(int n)
{
int arr[MAX];
// The array initially contains 1
arr[0] = 1;
int arrLeng = 1;
// multiply the nth number with n 1 to obtain the factorial
for(int i = 2; i <=n; i )
arrLeng = multiply(arr, i, arrLeng);
// print the final ans array though in reverse order
for(int i = arrLeng-1; i >= 0; i--)
cout<<arr[i];
cout<<endl;
}
int main()
{
// input the number
int n;
cin>>n;
// call the main function
factorial(n);
return 0;
}
Комментарии:
1. кстати, я пытался использовать динамический массив, который тоже выдает ту же ошибку. Я использовал int * arr = new int[MAX];
2. Насколько велик «большой»? 500 цифр достаточно для 253 !, но не более.
3. @molbdnilo в вопросе указано n<= 500. итак, я должен увеличить значение MAX?
4. 500! содержит 1135 десятичных цифр.
5. 1135 значений в массиве, т.е. Установка МАКСИМАЛЬНОГО значения на 1135, кажется странной. Это много для стековой памяти. Кстати, все еще получаю ту же ошибку
Ответ №1:
arrLeng
превышение предела жестко запрограммированного МАКСИМУМА 500.
У вас всегда должна быть проверка индекса. Он не должен превышать максимальный предел. Это не проблема выделения памяти в стеке или куче.