Понимание распределения памяти и указателей в c

Я пытаюсь углубить свое понимание операционных систем. Моя система 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 страницы, я прав?


person aboria    schedule 28.01.2019    source источник
comment
4099 превышает границы массива -> поведение undefined   -  person Stephan Lechner    schedule 29.01.2019
comment
Спасибо за вопрос. Во-первых, это неопределенное поведение, поэтому реализация может делать все, что захочет. Тем не менее, на практике нет гарантии, что выделенный вами буфер был выделен на границе страницы. Вполне вероятно, что что-то во внутренних библиотеках C/среде выполнения уже выделило некоторую память, поэтому ваше выделение для p закончилось через границу страницы, или, по какой-то удаче, p[4099] — это какой-то другой участок памяти, который вы испортили, записав в него.   -  person nanofarad    schedule 29.01.2019
comment
На самом деле это дубликат, есть сотни вопросов, спрашивающих, почему программа выжила, когда ОП считал, что она должна была разбиться.   -  person Weather Vane    schedule 29.01.2019
comment
Вы не разговариваете со своей операционной системой, вы разговариваете с malloc. malloc не имеет понятия о страницах.   -  person melpomene    schedule 29.01.2019
comment
Ни одна из этих двух ссылок не является хорошим дубликатом. Они не касаются страницы.   -  person melpomene    schedule 29.01.2019


Ответы (1)


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

Также см. принятый ответ здесь

person RenderedNonsense    schedule 28.01.2019