Здесь можно найти больше ответов на юридические вопросы (например, не полагайтесь на системные реализации в вашем коде и смотрите отказ от ответственности ниже), но в основном да, вот как это работает.
Все скомпилированный код из вашей программы, включая функцию, которую вы проиллюстрировали, является частью сегмента кода (также смущенно известного как «текстовый» сегмент) в результирующем двоичном изображении. Загрузчик ОС разделит эти байты скомпилированного кода в этом сегменте памяти в процессе, и если вы таким образом берете адрес функции c, вы увидите соответствующий код, находящийся где-то в этом сегменте. То же самое будет верно для main
, et c.
То, как скомпилированная программа попадает в память и исполняется, намного менее волшебно, чем может показаться. Если оставить в стороне механизмы безопасности современной ОС, например, c, это выглядит примерно так:
- Toolchain превращает весь ваш код C в поток исполняемых байтов. Каждая скомпилированная функция обязательно начинается с определенного смещения в этот поток байтов.
- «Образ» (исполняемый файл) содержит в себе различные сегменты: сегмент кода, набор глобальных переменных с их инициализированными значениями, сегмент , указывающий на некоторые изначально нулевые значения, которые должны появиться при запуске программы, но которые не должны быть явно включены в изображение, и т. Д. c.
- Загрузчик в ОС разбирает файлы изображений и отбрасывает различные части в память так, как он хочет, с помощью соответствующих флагов исполняемого файла / чтения / записи, исправляет ссылки на stati c и затем переходит управление первым байтом вашей функции
main
(посредством скрытого от вас C материала времени выполнения).
Когда вы получаете адрес своей функции, там нет маги c, это указатель на первый байт скомпилированных инструкций для этой функции.
Профессиональная разработка программного обеспечения Отказ от ответственности Как видно из комментариев к этому ответу и вопросу, в реальном диком мире существует множество вариантов работы компоновщиков и загрузчиков; Есть системы, которые на самом деле не делают это таким образом. Конечно, вы бы никогда не написали широко переносимый код C, который делал бы предположения о сегментах памяти. Но в педагогических целях, если вы пользуетесь одной из знаменитых традиционных настольных ОС, она * squints * в основном работает более или менее так, как вы себе представляете. (Если вы сможете найти старую копию «Современных операционных систем» Таненбаума, даже старое первое издание, она осветит множество, казалось бы, непрозрачных тем в этой вене.)