Почему существует ограничение на доступ к массиву в C?

#c #arrays #limit

#c #массивы #ограничение

Вопрос:

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

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

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

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

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

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

1. Я думаю, что некоторые реализации malloc имеют недокументированное поведение на определенных входных данных, таких как (size_t)-2 , и делают что-то другое, кроме фактического выделения памяти.

Ответ №1:

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

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

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