Ошибка сегментации | вычисление факториала | отсутствие индекса

#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.

У вас всегда должна быть проверка индекса. Он не должен превышать максимальный предел. Это не проблема выделения памяти в стеке или куче.