|
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
|
|||||||||||||||||||||
Компилятор, препроцессор, язык Си26.12.2023, 21:49. Показов 2402. Ответов 22
Всем привет. Стал изучать указатели и возник вопрос, связанный с инициализацией переменных и адресов. Что происходит с компилятором? Решил провести и программу для теста.
Алгоритм такой 1. Создать переменную 2. Выйти из области видимости 3. Создать переменную 4. Вернуться в область видимости 5. Проверить адрес Программа работает как и ожидалось, смещение в стеке 4 байта, но если повторить итерацию, то адреса дадут неожиданный результат, что сломало мне мозг. Для объяснении проблемы выведу адресацию в таком стиле X+0. Алгоритм выглядит так: инициализация X+0(имя переменной = i) выход из {} инициализация другой переменной, где ей дают X+4(потому что int занимает в стэке 4 байта, если я правильно понимаю) вход в {}, где снова инициализируется i, и ей снова дается адрес X+0 инициализация переменной i в другой области видимости{}, где ей даётся адрес X+8 но прикол в том, что на этот раз, программа выдала адреса другим образом. Ожидалось адресация X+0, X+4, X+8 и т.д., но она выдала X+0, X+8, X+4. Вопрос почему? Второй вопрос, как компилятор хранит переменные. Почему он понимает, что в одном месте к переменной X я обращаюсь по адресу X+0, а в другом месте к переменной Х, я обращаюсь по адресу X+N? Программа написана таким алгоритмом:
Вот полный код
Решил дописать код только что. У меня появилась теория, что инициализация переменных идет либо в порядке исполнения, либо с конца кода программы. Добавил 3 и 4ый указатель. Алгоритм инициализации: p2 p3 p4 p1 если рассматривать с точки зрения кода p1 p2 p4 p3 если рассматривать с точки зрения исполнения программы. Адресация не соответствует ожиданиям x+0 x+12 x+4 x+8 если рассматривать адресацию слева-направо и справа-налево с точки зрения кода и исполнения, это невозможно ни при каких обстоятельствах. Как и нелогичное поведение программы
Добавлено через 9 минут Всё. Я разобрался в теме. Инициализация переменных идет снизу вверх, не по алгоритму, а снизу вверх по коду. Просчитался.
p1, p4, p3, p2
0
|
|||||||||||||||||||||
| 26.12.2023, 21:49 | |
|
Ответы с готовыми решениями:
22
Как настроить компилятор Visual Studio 2017 на язык Си? Русский язык в консоли Windows 10. IDE: CodeLite. Компилятор: TDM-GCC-32 Ассемблер - это макропроцессор, транслятор, препроцессор, интерпретатор, компилятор, кросскомпилятор или транслитератор? |
|
Просто Лис
|
||
| 31.12.2023, 15:29 | ||
|
А так похоже на оптимизацию, область видимости одной переменной кончилась (и её lifetime), значит место свободное, можно переиспользовать.
0
|
||
|
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
|
||
| 31.12.2023, 18:34 | ||
|
0
|
||
|
Просто Лис
|
||||||
| 31.12.2023, 18:51 | ||||||
|
В x86_64 в прологе функции сохраняется указатель на вершину стека, потом выделяется кадр функции. В эпилоге функции кадр функции "схлопывается".
0
|
||||||
| 31.12.2023, 18:51 | |
|
Помогаю со студенческими работами здесь
23
Компилятор с языка PL/1 на язык Ассемблер Можно ли сделать язык(компилятор к нему тоже), который бы не зависел от ОС и програмного обеспечения? Препроцессор Препроцессор Препроцессор Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|