Из интерфейса программирования Linux:
int brk(void * end_data_segment );
Системный вызов
brk()
устанавливает прерывание программы в место, указанноеend_data_segment
. Поскольку виртуальная память выделяется в единицах страниц,end_data_segment
эффективно округляется до границы следующей страницы.
Итак, для этой демонстрации:
#include <stdio.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
long int page_size = sysconf(_SC_PAGESIZE);
printf("My page size: %ld\n", page_size);
void* c1 = sbrk(0);
printf("program break address: %p\n", c1);
printf("sizeof char: %lu\n", sizeof(char));
c1 = (void*) ((char*) c1 + 1);
printf("c1: %p\n", c1);
brk(c1);
void* c2 = sbrk(0);
printf("program break address: %p\n", c2);
}
выход:
My page size: 4096
program break address: 0x55b0bc104000
sizeof char: 1
c1: 0x55b0bc104001
program break address: 0x55b0bc104001
Я ожидаю, что новый адрес прерывания программы будет: 0x55b0bc104000 + 0x1000(4096 in HEX) == 0x55b0bc105000
Почему я получил не 0x55b0bc105000
, а 0x55b0bc104001
?
char
указывается всегда равным1
. Вам действительно не нужно печатать его. Во-вторых, правильный формат для печати значенияsize_t
(как указано, например,sizeof
) —%zu
. Несоответствие спецификатора формата и типа приводит к неопределенному поведению. - person Some programmer dude   schedule 14.01.2020