Почему существует ограничение в доступе к массиву в C? - PullRequest
0 голосов
/ 25 марта 2019

Система OSX может выделять память точно из malloc (возвращает не NULL).Однако при доступе к проходу позиции 1073741823 произошла ошибка сегментации: 11.Может ли кто-нибудь объяснить мне причину?

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

    void dead(){
        size_t pos = 0;
        size_t max =2147483647;
        max *= 2;
        printf("%ld\n",max);
        int* data = malloc(max);
        if(data == NULL){exit(1);}
        pos = 2147483647/2;
        pos-=3;
        for (; pos < 2147483647; pos++) {
            printf("%ld\n",pos);
            data[pos] = 10;
            printf("%i\n",data[pos]);
        }
    }

    4294967294
    1073741820
    10
    1073741821
    10
    1073741822
    10
    1073741823
    10
    1073741824
    Segmentation fault: 11

Теоретически там не должно умереть.

1 Ответ

2 голосов
/ 25 марта 2019

Функция malloc() выделяет chars, а sizeof(int) обычно намного больше, чем 1 символ.

Например;если вы выделяете память для 2147483647 символов, но sizeof(int) - это "4 символа";тогда вы только выделите достаточно памяти для «2147483647/4 = 536870911 дюймов».

Обратите внимание, что malloc() обычно запрашивает у операционной системы больший объем памяти и разбивает ее на более мелкие части.Это означает, что когда вы получаете доступ к чему-то, что не было выделено с помощью malloc(), вы все равно можете получить доступ к большему объему памяти, для которого malloc() запрашивала ОС, поэтому вы не получите ошибку страницы («ошибка сегментации») каккак только вы получаете доступ к чему-то, что вы не выделяли (точнее, вы не получаете «ошибку сегментации», как только вы пытаетесь получить доступ к 536870912-му int, для которого вы не выделяли память).

...