C, почему это объявление большого массива создает ошибку сегментации?

Этот код вызывает ошибку сегментации во время объявления массива. Я смущен, почему это происходит. Я намеренно выбрал 2000000000 в качестве значения, потому что он ниже 2 ^ 31 и может вписываться в целочисленную переменную.

int main() { int nums_size = 2000000000; int nums[nums_size]; int i; for(i = 0; i < nums_size; i++) { nums[i] = i; } return 0; } 

Ну, во-первых, это два миллиарда целых чисел. Если у вас есть 32-разрядное адресное пространство, а int имеет размер в четыре байта на вашей платформе (типичный для 32-разрядной платформы), вы не можете сохранить это множество целых чисел, период.

Тем не менее, у вас есть только столько места, которое доступно вам в стеке, где и находятся автоматические переменные.

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

 int nums_size = 2000000000; int nums[nums_size]; 

Не означает 2000000000 байтов ints, это означает 2000000000 элементов типа int, которые на 32-битной платформе означают, что вы потребляете почти 8 ГБ памяти – это невозможно.

Вы выделяете гигантский массив в стек. Практически никакой компилятор C / C ++ не справится с этим.

Возможно, вам удастся уйти с перемещением в глобальные переменные (которые будут выделять пространство статически путем сопоставления памяти в исполняемом файле во время компиляции) или путем переключения на массив malloc .

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

Локальные переменные выделяются в стеке. Существует фиксированное количество стека (обычно 1 МБ-8 МБ, зависит от ОС), предоставляемое приложению. Общее правило заключается в использовании malloc () для распределения больших объемов данных.

Ответ на ваш вопрос прост: stackoverflow . Нет, нет, не сайт, а фактический процесс «переполнения стека». У вас недостаточно стека для хранения этого массива. Так просто. Выполнение этого в системах с ограниченным объемом памяти – чистое безумие. Также см. Этот вопрос .

Эта версия отлично работает на моем ПК:

 const int nums_size = 2000000000; int nums[nums_size]; int main() { int i; for(i = 0; i < nums_size; i++) { nums[i] = i; } return 0; } 

(Хорошо, давайте будем честными. Это начинается нормально, но скоро идет в обмен.)

  • Сортировка двух NSArrays вместе бок о бок
  • Почему «int является uint == true» в C #
  • Доступ к массиву доступа за пределами C и C ++
  • Доступ к элементам элементов в JSONArray с помощью Java
  • Как преобразовать массив байтов в шестнадцатеричную строку и наоборот?
  • Ошибка компиляции кода слишком велика в Java
  • Почему я не могу создать массив с размером, определяемым глобальной переменной?
  • Как преобразовать массив int в String с помощью метода toString в Java
  • Структуры данных .NET: ArrayList, List, HashTable, Словарь, SortedList, SortedDictionary - Скорость, память и когда использовать их?
  • Как скопировать часть массива в другой массив в C #?
  • Ограничение на размер .Net-массива
  • Давайте будем гением компьютера.