Почему большой локальный массив разбивает мою программу, но глобальный – нет?

Программа с большим глобальным массивом:

int ar[2000000]; int main() { } 

Программа с большим локальным массивом:

 int main() { int ar[2000000]; } 

Когда я объявляю массив с большим размером в основной функции, программа вылетает с «SIGSEGV (Ошибка сегментации)».

Однако, когда я объявляю его глобальным, все работает нормально. Почему это?

Объявление массива глобально заставляет компилятор включать пространство для массива в раздел данных скомпилированного двоичного файла. В этом случае вы увеличили двоичный размер на 8 МБ (2000000 * 4 байта на int). Однако это означает, что память доступна в любое время и не требуется выделять ее в стек или кучу.

EDIT: @Blue Moon справедливо указывает, что неинициализированный массив, скорее всего, будет выделен в bss данных bss и, по сути, не займет дополнительного места на диске. Инициализированный массив будет распределен статически.

Когда вы объявляете массив, который большой в вашей программе, вы, вероятно, превысили размер стека программы (и иронически вызвали переполнение стека ).

Лучшим способом динамического выделения большого массива является использование указателя и выделение памяти в куче следующим образом:

 using namespace std; int main() { int *ar; ar = malloc(2000000 * sizeof(int)); if (ar != null) { // Do something free(ar); } return 0; } 

Здесь можно найти хороший учебник по макету памяти программ C.

  • Отправить массив с HTTP Get
  • Неизменяемый массив в Java
  • Индекс массива не связан с C
  • Сохраняется ли порядок элементов в списке JSON?
  • Хранение массивов в базе данных: JSON и сериализованный массив
  • лучший способ сделать многоязычный веб-сайт codeigniter. вызов из lang-массивов зависит от сеанса lang?
  • Хранение идентификаторов R.drawable в массиве XML
  • Экспорт массива в сценарий bash
  • Объявить массив const
  • «Примечание: неопределенная переменная», «Примечание: неопределенный индекс» и «Примечание: неопределенное смещение» с использованием PHP
  • Как передать multidimensional array функции в C и C ++
  • Давайте будем гением компьютера.