Проблема с объявлением массива C

#c #arrays

#c #массивы

Вопрос:

Этот код выдает ошибку segfault :

 #include <stdio.h>  

int main(int argc,char** argv[]){  

int ar[20000000];  

return 0;  

}  
  

Но если я уменьшу размер массива на 0 — тогда все в порядке. Я превышаю максимальный размер? Что, если я хочу сохранить такое количество целых чисел? Спасибо.

Ответ №1:

Вероятно, это связано с тем фактом, что вы пытаетесь выделить более 70 мегабайт данных в стеке. Размер стека Windows по умолчанию равен 1 мегабайту на поток IIRC. Попробуйте разместить его в свободном хранилище с помощью new , вот так:

 int* ar = new int[20000000];
  

и когда вы закончите его использовать, delete[] это:

 delete[] ar;
  

Комментарии:

1. Почему вы думаете, что это 70 мегабайт? В стандарте C / C не сказано, что значение int равно 32 битам.

Ответ №2:

У вас переполнение стека : D реальное.

Выделите память в куче, используя new

 int* ar = new int[ 20000000 ];
// do stuff with ar
delete[] ar; // do **not** forget about this
  

Ответ №3:

объявление int ar[20000000] в стеке занимает около 70 МБ (76,2939453 МБ) памяти… может быть, вам не хватает места?

Используется new для выделения в куче.

Комментарии:

1. фактически 76.2939453 мегабайта.

2. 76.2939453 мбайт (MiB), но 80 мегабайт (MB).

Ответ №4:

Возможно, вы превышаете размер, разрешенный фреймом стека, который применяется вашим компилятором. Если бы вы распределяли пространство динамически, например:

int array = новый int[РАЗМЕР]

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

Ответ №5:

Если я не ошибаюсь, 4 миллиона — это предел

Ответ №6:

Если вы действительно хотите разместить этот массив в стеке, вы можете. Вам просто нужно увеличить размер стека. Вы не говорите, какой компилятор / компоновщик вы используете, но инструкции для Visual Studio C находятся здесь: http://msdn.microsoft.com/en-us/library/tdkhxaks.aspx и другие среды должны иметь аналогичные параметры.