Я понимаю, что перерыв программы – это максимальный адрес виртуальной памяти, выделенный операционной системой Linux для процесса. , и поэтому отмечает наивысший адрес кучи. Вы можете получить адрес прерывания программы, вызвав sbrk( 0 ).
Когда я создаю следующую тривиальную программу, я получаю разные результаты при каждом ее запуске:
#define _BSD_SOURCE
#include <stdio.h>
#include <unistd.h>
int main()
{
printf( "system break: %p\n", sbrk( 0 ) );
return 0;
}
Например, на моем ПК:
$ ./sbrk
system break: 0x81fc000
$ ./sbrk
system break: 0x9bce000
$ ./sbrk
system break: 0x97a6000
Насколько я понял, куча размещается непосредственно над разделом BSS в виртуальной памяти — я думаю, я ожидал, что она всегда будет иметь одно и то же начальное значение для такой тривиальной программы. Есть ли какая-то рандомизация или что-то еще в том месте, где изначально расположен перерыв в программе? Если нет, то почему каждый раз, когда я запускаю программу, она меняется?