Ошибка сегментации при больших размерах массива

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

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

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

Ответ 1

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

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

int* array = new int[1000000];

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

Ответ 2

В C или С++ локальные объекты обычно выделяются в стеке. Вы выделяете большой массив в стеке, больше, чем может обрабатывать стек, поэтому вы получаете fooobar.com/questions/71187/...

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

Это будет выделено в сегменте 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;
}

Ответ 3

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

ulimit -s unlimited

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

Ответ 4

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

Ответ 5

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