Чтобы расширить другие два ответа:
На большинстве (не встроенных) платформ при компиляции модуля код и данные хранятся в секциях объектного файла. Компоновщик объединяет эти разделы вместе при сборке окончательной программы. Например, в форматах объектов COFF, PE и ELF весь код размещается в секции .text
. Все предварительно инициализированные данные хранятся в разделе .data
или .bss
.
Где эти сегменты на самом деле являются на самом деле не важно. Когда программа загружена, компоновщик времени выполнения (называемый ld-linux.so
в Linux) загрузит всю программу в один или несколько областей памяти, а операционная система отобразит каждый из разделов в свои сегменты памяти , Это предполагает, что платформа имеет сегменты памяти и MMU, как на x86. Многие современные операционные системы также рандомизируют местоположения , в которые загружаются эти разделы, для безопасности. Поэтому при каждом запуске программы данная функция может не иметь один и тот же адрес.