#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 и другие среды должны иметь аналогичные параметры.