|
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
|
|||||||||||||||||||||
Компилятор, препроцессор, язык Си26.12.2023, 21:49. Показов 2750. Ответов 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 | |
|
Компилятор с языка PL/1 на язык Ассемблер Можно ли сделать язык(компилятор к нему тоже), который бы не зависел от ОС и програмного обеспечения? Препроцессор Препроцессор Препроцессор Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|