Как решить проблему размера стека в 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 (во время компиляции):

  1. Выбрать Project->Setting,
  2. Выбрать Link стр.
  3. Выбрать Category to Output,
  4. Введите предпочитаемый размер стека в 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 МБ, если я не ошибаюсь), и вы определяете массив, например, достаточно большой structs (точнее размером 64 байта), то это может легко вызвать переполнение стека, поскольку автоматические массивы обычно (хотя и не обязательно) размещаются в стеке.

Похоже, вы пытаетесь объявить большие массивы в стеке. Память стека обычно ограничена; Похоже, вы переполнены.

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

static BigStruct arr[128][128];

или путем динамического выделения памяти для него

BigStruct (*arr)[128] = malloc(sizeof(*arr) * 128);
// use arr
free(arr);

Полный макет Visual Studio требует минимум 35 ГБ дискового пространства. Для получения дополнительной информации см. Системные требования. А для получения информации о том, как создать макет только с теми компонентами, которые вы хотите установить, см. Раздел Использование параметров командной строки для установки Visual Studio.

Другие вопросы по тегам