Что вызывает переполнение стека?

Основываясь на следующем вопросе (храня данные в переменной) в комментариях к сообщению chdir, я уверен, что он хочет сохранить текущий путь для его восстановления после смены каталогов.

оригинальный пользователь должен посмотреть на «pushd», который меняет каталог и толкает текущий в стек, который можно восстановить с помощью «popd». На любой современной Windows CMD-оболочке, которая подходит для создания пакетных файлов.

Если вам действительно нужно захватить текущий путь, то в современных CMD-оболочках также есть переменная% CD%, которую вы можете легко набрать в другой переменной для ссылки.

6
задан Paŭlo Ebermann 23 August 2011 в 18:14
поделиться

6 ответов

Может помочь, отправляете ли Вы некоторый код. Отредактируйте вопрос включать проблемную функцию и ошибку.

Между тем вот очень универсальный ответ:

Две основных причины переполнения стека 1) рекурсивная функция, или 2) выделение большого количества локальных переменных.

Рекурсия

если Ваши вызовы функции самостоятельно, как это:

int recurse(int number) {

    return (recurse(number));
}

Так как локальные переменные и аргументы функции хранятся на стеке, затем он будет полностью стек и вызывать переполнение стека.

Большие локальные переменные

При попытке выделить большой массив локальных переменных затем, можно переполнить стека в одном легком движении. Функция как это может вызвать проблему:

void hugeStack (void) {

    unsigned long long reallyBig[100000000][1000000000];

    ...
}

Существует вполне подробный ответ на этот подобный вопрос.

10
ответ дан 8 December 2019 в 14:49
поделиться

Так или иначе Вы используете много стека. Возможные причины включают это, Вы создаете таблицу маршрутизации на стеке, Вы передаете его стеку, или иначе Вы генерируете много вызовов (например, путем рекурсивной обработки всего этого).

В первых двух случаях необходимо создать его на "куче" и раздать указатель на него. В третьем случае необходимо будет переписать алгоритм в повторяющейся форме.

3
ответ дан 8 December 2019 в 14:49
поделиться

Переполнения стека могут произойти в C, когда количество встроенных рекурсивных вызовов слишком высоко. Возможно, Вы вызываете функцию от себя слишком много раз?

Эта ошибка может также произойти из-за выделения слишком большой памяти в статических объявлениях. Можно переключиться на динамические выделения через malloc () для фиксации этого типа проблемы.

Существует ли причина, почему Вы не можете использовать отладчик на этой программе?

1
ответ дан 8 December 2019 в 14:49
поделиться

Это зависит от того, где Вы объявили переменную.

Локальная переменная (т.е. один объявленный на стеке ограничен максимальным размером кадра) Это - предел компилятора, который Вы используете (и может обычно корректироваться с флагами компилятора).

Динамично выделенный объект (т.е. тот, который находится на "куче") ограничен объемом доступной памяти. Это - свойство ОС (и может технически большим физическая память, если у Вас есть умная ОС).

1
ответ дан 8 December 2019 в 14:49
поделиться

Много операционных систем динамично разворачивают стек, поскольку Вы используете больше из него. Когда Вы начинаете писать в адрес памяти, это только вне стека, ОС предполагает, что Ваш стек только что вырос немного больше и выделяет его дополнительная страница (обычно 4096 кибибитов на x86 - точно 1024 ints).

Проблема на x86 (и некоторая другая архитектура), стек растет вниз, но массивы C растут вверх. Это означает, получаете ли Вы доступ к запуску большого массива, Вы будете получать доступ к памяти, это на расстоянии больше чем в одна страница от края стека.

При инициализации массива к 0 запускам с конца массива (правильно, сделайте, чтобы цикл сделал это), ошибки могли бы уйти. Если они делают, это - действительно проблема.

Вы смогли находить, что некоторые API-функции ОС вызывают выделение стека или прагмы/флаги компилятора. Я не уверен в том, как это может быть сделано портативно, кроме, конечно, для использования malloc () и свободное ()!

1
ответ дан 8 December 2019 в 14:49
поделиться

Вы вряд ли столкнетесь с переполнением стека с непотоковым скомпилированным C, если Вы не сделаете что-то особенно вопиющее как имеет безудержную рекурсию или космическую утечку памяти. Однако Ваше средство моделирования, вероятно, имеет пакет поточной обработки, который наложит ограничения размера стека. Когда Вы начнете новую дискуссию, она выделит блок памяти для стека для того потока. Вероятно, существует параметр, который можно установить где-нибудь, который устанавливает размер стека по умолчанию, или может быть способ вырастить стек динамично. Например, pthreads имеет функцию pthread_attr_setstacksize (), который Вы называете до начинания новой дискуссии для установки ее размера. Ваше средство моделирования может или не может использовать pthreads. Консультируйтесь со своей справочной документацией средства моделирования.

0
ответ дан 8 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: