Ошибка сегментации при создании массива в C - PullRequest
5 голосов
/ 24 сентября 2011

Я недавно перешел на новый ноутбук - HP dv6119tx (Intel Core i5, 4 ГБ оперативной памяти). На нем установлена ​​64-битная Windows 7 Home Premium.

Я пытаюсь создать массив типа int длиной 10 ^ 6 в C ++ (Dev C ++), который я использовал для удобного создания на своем последнем ноутбуке (32-битная Windows 7 Ultimate / Ubuntu Linux, 2 ГБ ОЗУ) и все остальные среды, в которых я запрограммирован (должно занимать около 3,5 МБ ОЗУ). Но при текущей настройке я получаю ошибку «Ошибка сегментации» в режиме отладки.

Screenshot when I am trying to create an array of length 10^5

Screenshot when I am trying to create an array of length 10^6

СКРИНШОТЫ (РЕДАКТИРОВАТЬ):
На первом снимке экрана показано, что 10 ^ 5 работает с текущей настройкой, а 10 ^ 6 - нет. У меня нет скриншота для 10 ^ 6, работающего на моей последней машине, но я использовал его много раз.

EDIT:
Программа работала бы нормально, если бы я объявил массив как global или создал его динамически в куче как

int* a = new int[MAX];  

Но что я не понимаю, так это то, что когда локальный массив занимает в стеке скудные 3,5 МБ памяти (и нормально работал на машине с 2 ГБ), почему эта проблема возникает на машине с 4 ГБ? Это проблема стека пользователя? Можно ли его увеличить вручную?

РЕДАКТИРОВАТЬ 2:
Я особенно задаю этот вопрос, потому что я представил множество решений для SPOJ с массивами размером 10 ^ 6, созданными в стеке. С моей текущей настройкой я чувствую себя неполноценным, неспособным сделать это. Я предпочитаю стек поверх кучи, когда это возможно, потому что у него нет проблем с утечкой памяти; и локальные переменные над глобальными переменными, потому что они аккуратны и не портят пространство имен.

Ответы [ 3 ]

9 голосов
/ 24 сентября 2011

Стек в четыре мегабайта довольно большой. Размер по умолчанию в Windows составляет 1 МБ. Вам нужно использовать опцию /STACK для компоновщика, чтобы запросить больший размер.

8 голосов
/ 24 сентября 2011

Массивы, созданные таким образом, хранятся в стеке. Однако размер стека очень ограничен, поэтому вы попадаете в переполнение стека и вылетаете.

Способ сделать это - разместить его в куче:

int *a = (int*)malloc(MAX * sizeof(int));

//  Do what you need to do.

//  Free it when you're done using "a".
free(a);
2 голосов
/ 25 сентября 2011

Вместо malloc'ating памяти вы можете указать свой буфер как static. E.g.:

static int a[MAX];

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

...