Intereting Posts
Как программно вернуть максимум двух целых чисел без использования каких-либо операторов сравнения и без использования if, else и т. Д.? Slack byte в структурах C c несовместимые типы в задании, проблема с указателями? segmentation fault при назначении элементов структуры в c Возможно ли иметь вариационную функцию в C без невариантного параметра? Перегрузка free (), поэтому моя программа использует мои, а не систему Простые hash-функции Является ли snprintf () ВСЕГДА нулевым завершением? многопоточная реализация сервера / клиента в C Как преобразовать 32-разрядное целое число в 64-битное значение в C Есть ли точка последовательности между этими назначениями? нужны программы, которые иллюстрируют использование функций настройки и сигнализации в GNU C Роллинг-медиана в реализации C-Turlach Портативный способ проверить, является ли указатель char * строкой с нулевым завершением Как легально использовать тип-караунд с союзами, чтобы бросить между вариациями структуры sockaddr, не нарушая правила строгого сглаживания?

Создание больших массивов в C

Мой вопрос связан с языком C. Я должен создать большой массив из примерно двух миллионов элементов, но компьютер дает ошибку «Ошибка сегментации (Core dumped)». Я просто говорю:

int integer_array[2000000]; float float_array[2000000]; 

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

Обычно вам нужно создать такой массив динамически в куче.

 int *integer_array = (int*)malloc(2000000 * sizeof(int)); float *float_array = (float*)malloc(2000000 * sizeof(float)); 

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

 int main () { int a[200000000]; /* => SEGV */ a[0]=0; } 

Самое простое исправление, перемещение массива снаружи:

 int a[200000000]; int main () { a[0]=0; } 

Вы также можете объявить его статическим:

 int main () { static int a[200000000]; a[0]=0; } 

Обратите внимание, что размер стека зависит от системы. Его можно изменить с помощью ulimit.

Определите их как static или поставленные вне функции. Теперь они автоматические и получают 16 МБ пространства стека, которое, вероятно, значительно уменьшено. BTW, лучше использовать double вместо float .