#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
, для которого вы не выделяли память).