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