Страницы

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

среда, 5 февраля 2020 г.

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

#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. А что будет, если компилятор попытается соптимизировать эти инструкции - вообще загадка. И еще попробуйте найти разницу с программой такой: #include int 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 стек растет наоборот: от меньших адресов в большим, и там будет наблюдаться обратная картина.

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

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