Как работает sbrk()?

Я пытаюсь понять как sbrk работает.

Вот мой маленький код:

int  main()
{  
    printf("end of the break : %p\n", sbrk(0));
    printf("end of the break : %p\n", sbrk(10));
    printf("new end of the break : %p\n\n", sbrk(0));
}

Это выводит:

end of break : 0xaa6000    
end of break : 0xac7000    
new end of the break : 0xac700a    

Почему разница между первыми двумя адресами 0xac7000 - 0xaa6000 = 21000, а не 10?

1 ответ

sbrk(n) увеличивает разрыв на n и возвращает старое значение разрыва.

Таким образом:

    printf("end of the break : %p\n", sbrk(0));

Выход: end of the break : 0xaa6000

Первоначально, разрыв составляет 0xaa6000 и sbrk звонок не меняет это.

    printf("end of the break : %p\n", sbrk(10));

Выход: end of the break : 0xac7000

Это значение, о котором вы спрашиваете. Выше я сказал sbrk(0) не изменил бы разрыв, так почему мы получаем другое значение здесь?

Единственное, что произошло между двумя sbrk вызов - это вызов первому printf, Предположительно внутренности вашей реализации stdio используют malloc (например, для создания буферов), который в свою очередь вызывает sbrk сам. Другими словами, printf звонки malloc внутренне, который резервирует память, используя sbrk,

    printf("new end of the break : %p\n\n", sbrk(0));

Выход: new end of the break : 0xac700a

На этот раз мы видим приращение 0xa, которое соответствует вашему предыдущему sbrk(10) позвони точно. Видимо на этот раз printf не нужно было выделять динамическую память (или, если это было сделано, malloc был в состоянии сделать все в пространстве, которое он получил с первого раза sbrkтак что не нужно было запрашивать больше у ОС).

Другие вопросы по тегам