Увеличить размер стека в c

#c #visual-studio #stack-overflow

#c #visual-studio #переполнение стека

Вопрос:

Я задавал этот вопрос пару дней назад, но это не решило мою проблему. Я не могу увеличить размер стека в Visual Studio, я использую рекурсивный метод, который получает большой объем входных данных и вызывает переполнение стека. Я не могу использовать vector или что-то еще. Что мне нужно, так это увеличить размер стека в c , Visual Studio.

PS Я увеличил размер стекового резерва из конфигурации Visual Studio, однако это также не решает мою проблему.

 void sorting:: MergeSort(int *theArray, int n) {


    mergesort(theArray, 0, n - 1);

}
void sorting::mergesort(int *theArray, int first, int last) {
    if (first < last) {

        int mid = (first   last) / 2;   // index of midpoint

        mergesort(theArray, first, mid);

        mergesort(theArray, mid   1, last);

        // merge the two halves
        merge(theArray, first, mid, last);
    }
}  // end mergesort
void sorting::merge(int* theArray, int first, int mid, int last) {
    const int max_size = 500000;
    int tempArray[max_size];
    int first1 = first;     // beginning of first subarray
    int last1 = mid;        // end of first subarray
    int first2 = mid   1;   // beginning of second subarray
    int last2 = last;       // end of second subarray
    int index = first1; // next available location in tempArray

    for (; (first1 <= last1) amp;amp; (first2 <= last2);   index) {
        if (theArray[first1] < theArray[first2]) {
            tempArray[index] = theArray[first1];
              first1;
        }
        else {
            tempArray[index] = theArray[first2];
              first2;
        }
    }
    // finish off the first subarray, if necessary
    for (; first1 <= last1;   first1,   index)
        tempArray[index] = theArray[first1];

    // finish off the second subarray, if necessary
    for (; first2 <= last2;   first2,   index)
        tempArray[index] = theArray[first2];

    // copy the result back into the original array
    for (index = first; index <= last;   index)
        theArray[index] = tempArray[index];
    delete[] tempArray;
}  // end merge
  

И моя основная функция.

   #include <iostream>
    #include <ctime>
    #include "sorting.h"

    using namespace std;



    int main()
    {
        sorting sort;
        int size = 500000;
        int *myArr=new int[size];

        for (int i = 0; i < size; i  ) {
            myArr[i] = rand() % size;
        }
        cout << clock()<<"   ";
        sort.MergeSort(myArr,size);
        cout<<clock();
        cin.get();
    }
  

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

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

2. кто написал delete temparray; ? Надеюсь, не автор книги. Взгляните правде в глаза. Неправильный код.

3. Заменить int tempArray[max_size]; на int* tempArray = new int [max_size]; . Ваш delete не определен, и очень удивительно, что вы не зависаете каждый раз.

4. @Shahriyar Mammadli Код может быть взят из книги, но он все равно довольно ужасен. Просто упомяну несколько вещей; ручное управление памятью и владение необработанными указателями — нет, используйте интеллектуальные указатели. const Нигде не используется. Использование rand который является ужасно плохим генератором — используйте random средства вместо этого. Использование modulo для получения дистрибутива — не делайте этого, вы искажаете свои цифры. И это еще не все… Переполнение стека — это всего лишь одна из многих проблем с этим кодом.

5. Добавление 2 МБ в стек в рекурсивной функции приведет к быстрой остановке программы. Даже если вы увеличите размер стека, вам придется сделать его очень, очень большим. Как указано выше, динамическое распределение — это правильный путь. Вы должны быть в состоянии уменьшить использование памяти в temparray, выделяя только то, что вам нужно при каждом вызове. размер = последний — первый. однако это невозможно сделать с помощью автоматического выделения.

Ответ №1:

Я решил проблему, я думаю, это должно работать во всех IDE, но это определенно работает в Visual Studio. ПРОЕКТ-> Свойства-> Свойства конфигурации-> Компоновщик-> Система-> Размер стекового резерва = 4194304 . Это делает размер стека 4 МБ.

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

1. Ваш код по-прежнему содержит ошибки. Вам не нужна переменная auto tempArray в виде массива в стеке. Вам нужен указатель на массив, который выделяется с помощью int *tempArray = new int [max_size] . Это соответствовало бы вашему заявлению delete[] tempArray . Это устраняет необходимость в большом стеке.