C программирование, почему это объявление большого массива вызывает ошибку сегментации? - PullRequest
5 голосов
/ 16 июня 2010

Этот код вызывает ошибку сегментации во время объявления массива.Я не понимаю, почему это происходит.Я намеренно выбрал 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;

}

Ответы [ 6 ]

21 голосов
/ 16 июня 2010

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

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

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

4 голосов
/ 16 июня 2010
int  nums_size = 2000000000;

int nums[nums_size];

Не означает 2000000000 байтов целых чисел, это означает 2000000000 элементов типа int, что на 32-битной платформе означает, что вы используете почти 8 ГБ памяти - это невозможно.

3 голосов
/ 16 июня 2010

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

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

Конечно, это все еще ОГРОМНОЕ количество памяти, которое нужно запрашивать за один раз, но, по крайней мере, методы, которые я упоминаю, позволят избежать немедленного сегфоута.

2 голосов
/ 16 июня 2010

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

1 голос
/ 16 июня 2010

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

0 голосов
/ 16 июня 2010

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

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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...