Страницы

Поиск по вопросам

воскресенье, 7 апреля 2019 г.

Разница адресов в C

Есть следующий код: int main() { int a = 1; int b = 2; printf("%d", &a - &b); return 0; } Вопрос 1: Почему адрес переменной a больше адреса b. Вопрос 2: Почему разница адресов равна 3?


Ответ

Спешу порадовать, что конструкция &a - &b на мой взгляд может отработать как угодно. Если рассуждать логически, то память под переменные a и b выделяется на стеке. Т.е. от старших адресов к младшим. Причем память должна выделяться в порядке объявления переменных. Это и есть ответ на вопрос 1. Обычно переменные на стеке выделяются подряд, без промежутков. Но тут уж как повезет, т.к. может быть включено выравнивание памяти. И тогда все адреса всех объектов будут кратны каким-то значениям (например, 8 байтам). Более того, у меня лично программа выводит ответ 1. Это означает, что разница в адресах равна одному элементу размера int. А что будет, если компилятор попытается соптимизировать эти инструкции - вообще загадка. И еще попробуйте найти разницу с программой такой: #include
int main() { int a = 1; int b = 2; printf("%d", (char*)&a - (char*)&b); return 0; } Прошу обратить внимание, что включение заголовка stdio.h необходимо, иначе у компилятора немного крышу может сорвать.

Комментариев нет:

Отправить комментарий