Получение исключения из-за переполнения стека при объявлении большого массива

Следующий код генерирует ошибку переполнения стека для меня

int main(int argc, char* argv[])
{
    int sieve[2000000];
    return 0;
}

Как я обхожу это? Я использую Turbo C++, но хотел бы сохранить свой код в C

Править:

Спасибо за совет. Код выше был только, например, я на самом деле объявляю массив в функции а не в sub основном. Кроме того, мне был нужен массив, который будет инициализирован к нулям, поэтому когда я погуглил malloc, я обнаружил, что calloc идеально подходил для моих целей.

Malloc/calloc также имеет преимущество перед выделением на стопке разрешения мне объявить размер с помощью переменной.

37
задан Patrick McDonald 22 February 2009 в 06:25
поделиться

6 ответов

Ваш массив является слишком большим, чтобы вписаться в стек, рассмотреть использование "кучи":

int *sieve = malloc(2000000 * sizeof(*sieve));

, Если Вы действительно хотите изменить размер стека, , смотрят на этот документ.

Подсказка : - не забывают освобождать Вашу динамично выделенную память, когда она больше не необходима.

53
ответ дан Patrick McDonald 23 September 2019 в 20:48
поделиться

Вы были бы более обеспеченным выделением его на "куче", не стеке. что-то как

int main(int argc, char* argv[])
{
    int * sieve;
    sieve = malloc(20000);
    return 0;
}
2
ответ дан Cogsy 23 September 2019 в 20:48
поделиться

Есть ли некоторая причина, почему Вы не можете использовать alloca () для выделения места, в котором Вы нуждаетесь на стековом фрейме на основе того, насколько большой объект действительно должен быть?

, Если Вы делаете это, и все еще арестовывать стек, помещать его в выделенную "кучу". Я настоятельно рекомендую не объявление его как статичное в основном () и помещение его в сегменте данных.

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

, Что (точно) Вы пытаетесь выполнить?

0
ответ дан Tim Post 23 September 2019 в 20:48
поделиться

Существует 3 пути:

  1. Выделяют массив на "куче" - использование malloc(), как другие предложенные плакаты. Не забывайте к free() это (хотя для main() не то, чтобы важный - ОС очистит память для Вас на завершении программы).
  2. Объявляют массив на уровне единицы - он будет выделен в сегменте данных, и видимый для всех (добавление static к объявлению ограничит видимость единицей).
  3. Объявляют Ваш массив как static - в этом случае он будет выделен в сегменте данных, но видимый только в main().
12
ответ дан qrdl 23 September 2019 в 20:48
поделиться

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

1
ответ дан 23 September 2019 в 20:48
поделиться

Это составляет приблизительно 7 МБ стекового пространства. В Visual Studio Вы использовали бы/STACK:###,### для отражения размера, который Вы хотите. Если Вы истинно хотите огромный стек (могло бы быть серьезное основание, с помощью LISP или чего-то :), даже "куча" ограничена small'sh выделениями прежде, чем вынудить Вас использовать VirtualAlloc), можно также хотеть установить PE для создания с/LARGEADDRESSAAWARE (Компоновщик Visual Studio снова), но заголовок PE этого configure, чтобы позволить скомпилированному двоичному файлу обращаться к полным 4 ГБ 32'bit адресное пространство (при выполнении в WOW64). При создании истинно значительных двоичных файлов необходимо было бы также обычно настраивать/bigobj как дополнительный компоновщик пара-Мертер.

И если Вам все еще нужно больше пространства, можно радикально нарушить конвенцию при помощи чего-то средство моделирования к (снова ссылка MSVC) / слияние: который позволит Вам упаковывать один раздел в другого, таким образом, можно будет использовать каждый байт для единственного общего раздела кода/данных. Естественно необходимо было бы также настроить полномочия РАЗДЕЛОВ в файле определения или с #pgrama.

1
ответ дан RandomNickName42 23 September 2019 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: