Как решить проблему размера стека в Visual Studio (запуск кодов C с большим массивом)
Я использую Visual Studio 13 для компиляции кода c в первый раз. Коды отлично работают с 2-мерными массивами размером 64*64 (в моей программе есть несколько массивов), но если я увеличу размер массива до 128*128, он не запустится (но скомпилируется правильно). Вместо этого выдается сообщение ".exe перестал работать". Моя машина имеет 4 ГБ оперативной памяти, и та же программа запускается с массивом 128*128, если я запускаю коды из Linux.
Позвольте мне предоставить более подробную информацию: я запустил тот же код из Linux с помощью Intel C Compiler (некоммерческая версия) на той же машине. Но из-за какой-то проблемы я теперь вынужден работать из среды Windows. Я искал и установил два c-компилятора (1) Visual Studio 13 и (2) Borland C. Оба хорошо работают с небольшим массивом. Но в тот момент, когда я увеличиваю размер массива, Visual Studio выдает сообщение ".exe перестал работать". Я компилирую программу, используя 'cl' из "Командная строка для разработчиков VS 13".
Я чувствую, что проблема с размером стека.
В подробном объяснении ссылки (как показано ниже) я видел команду "ulimit", используемую в среде Linux для увеличения размера стека. Я помню, как использовал его несколько лет назад.
Я чувствую, что мы близки к решению, но моя проблема с Windows (и VS 2013) сохраняется, так как я не смог выполнить dumpbin /headers executable_file
или же editbin /STACK:size
, На самом деле я чувствую, что не знаю, как их выполнить. Я попытался выполнить их из "Developer Command Prompt VS 13", а также с помощью "Выполнить" (запуск Windows снизу -> поиск (запуск)-> Выполнение (поддержка вверх)). Я прошу вас предоставить более подробную информацию, если это возможно.
Я искал и нашел этот сайт и думаю, что здесь можно найти решение.
Пожалуйста помоги. Я хочу запустить с помощью Visual Studio 13 из Windows.
3 ответа
Кажется, что причина этого - переполнение стека. Проблема может быть решена путем увеличения размера стека.
В Visual Studio вы можете сделать это с помощью /STACK:reserve[,commit]
, Прочитайте статью MSDN.
Для более подробного объяснения:
На платформах Windows информация о размере стека содержится в исполняемых файлах. Это может быть установлено во время компиляции в Visual studio C++.
Кроме того, Microsoft предоставляет программу editbin.exe
который может изменить исполняемые файлы напрямую. Вот больше деталей:
Windows (во время компиляции):
- Выбрать
Project->Setting
, - Выбрать
Link
стр. - Выбрать
Category to Output
, - Введите предпочитаемый размер стека в
Reserve:
поле подStack allocations
, например,32768
в десятичном или0x20000
в шестнадцатеричном формате.
Windows (для изменения исполняемого файла):
Есть две программы, включенные в Microsoft Visual Studio, dumpbin.exe
а также editbin.exe
, Бежать dumpbin /headers executable_file
и вы можете увидеть size of stack reserve
информация в optional header values
, Бежать editbin /STACK:size
изменить размер стека по умолчанию.
Visual Studio не работает?
Хотя я не считаю VS действительным инструментом разработки, я очень сомневаюсь, что это вызовет вашу проблему.
128 * 128 - 16384. Если у вас слишком мало места в стеке (в Windows это по умолчанию 1 МБ, если я не ошибаюсь), и вы определяете массив, например, достаточно большой struct
s (точнее размером 64 байта), то это может легко вызвать переполнение стека, поскольку автоматические массивы обычно (хотя и не обязательно) размещаются в стеке.
Похоже, вы пытаетесь объявить большие массивы в стеке. Память стека обычно ограничена; Похоже, вы переполнены.
Вы можете исправить это, задав статическую длительность вашего массива.
static BigStruct arr[128][128];
или путем динамического выделения памяти для него
BigStruct (*arr)[128] = malloc(sizeof(*arr) * 128);
// use arr
free(arr);
Полный макет Visual Studio требует минимум 35 ГБ дискового пространства. Для получения дополнительной информации см. Системные требования. А для получения информации о том, как создать макет только с теми компонентами, которые вы хотите установить, см. Раздел Использование параметров командной строки для установки Visual Studio.