Ошибка сегментации на больших размерах массива - PullRequest
98 голосов
/ 04 декабря 2009

Следующий код выдает ошибку сегментации при запуске на машине с 2 ГБ, но работает на машине с 4 ГБ.

int main()
{
   int c[1000000];
   cout << "done\n";
   return 0;
}

Размер массива составляет всего 4 МБ. Есть ли ограничение на размер массива, который можно использовать в c ++?

Ответы [ 5 ]

110 голосов
/ 04 декабря 2009

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

Если вы разместите массив в куче, все будет в порядке, если на вашем компьютере достаточно памяти.

int* array = new int[1000000];

Но помните, что для этого потребуется delete[] массив. Лучшим решением было бы использовать std::vector<int> и изменить его размер до 1000000 элементов.

50 голосов
/ 04 декабря 2009

В C или C ++ локальные объекты обычно размещаются в стеке. Вы выделяете большой массив в стеке, больше, чем стек может обработать, поэтому вы получаете stackoverflow.

Не размещайте его локально в стеке, вместо этого используйте другое место. Этого можно достичь, сделав объект global или разместив его в глобальной heap . Глобальные переменные хороши, если вы не используете из любого другого модуля компиляции. Чтобы это не произошло случайно, добавьте статический спецификатор хранилища, в противном случае просто используйте кучу.

Это будет выделено в сегменте BSS, который является частью кучи:

static int c[1000000];
int main()
{
   cout << "done\n";
   return 0;
}

Это будет выделено в сегменте DATA, который также является частью кучи:

int c[1000000] = {};
int main()
{
   cout << "done\n";
   return 0;
}

Это будет выделять в неуказанном месте в куче:

int main()
{
   int* c = new int[1000000];
   cout << "done\n";
   return 0;
}
10 голосов
/ 08 ноября 2013

Кроме того, если вы работаете в большинстве систем UNIX и Linux, вы можете временно увеличить размер стека с помощью следующей команды:

ulimit -s unlimited

Но будьте осторожны, память - это ограниченный ресурс, и с большой силой приходят большие обязанности:)

2 голосов
/ 08 января 2011

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

2 голосов
/ 04 декабря 2009

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

...