Я пытаюсь углубить свое понимание операционных систем. Моя система Linux использует размер страницы 4096 байт. Я получил это, выполнив команду:
[root@localhost]# getconf PAGESIZE
4096
Я также знаю, что страница — это наименее адресуемая единица памяти. Итак, я попытался выделить именно это: 4096 байтов для указателя char, и я начал инициализацию следующим образом:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *p = malloc(4096*sizeof(char));
for(int i = 0 ;i< 4099;i++)
{
p[i] = 'c';
}
printf("Hey there!\n");
return 0;
}
Я знаю, что символы также имеют размер 1 байт.
Вот что я не понимаю, почему программа не сегментирует ошибку, хотя она должна была исчерпать одну страницу, выделенную для нее!
Это не повторяющийся вопрос, другие вопросы касаются передачи конца адресации массива без контекста размера страницы, как у меня здесь.
Насколько я понимаю, мой указатель p должен иметь доступ только к одной странице памяти размером, который я выделил 4096 байт. Если бы я выделил 5000 байт, то у него было бы 2 страницы, я прав?
4099
превышает границы массива -> поведение undefined - person Stephan Lechner   schedule 29.01.2019p
закончилось через границу страницы, или, по какой-то удаче,p[4099]
— это какой-то другой участок памяти, который вы испортили, записав в него. - person nanofarad   schedule 29.01.2019malloc
.malloc
не имеет понятия о страницах. - person melpomene   schedule 29.01.2019