2014-12-09 2 views
-1

Следующая main() это одна из моих попыток декодирования значения значений указателя:Что представляет собой шестнадцатеричный адрес C++?

int main(){ 
    int a = 15, b = 27; 
    int *p = &a, *q = &b; 
    cout << p << ',' << q; 
} 

Два значения, напечатанные в шестнадцатиричном, а именно p = 0x28fef4, q = 0x28fef0. Они выглядят как шестнадцатеричные значения, представляющие 2686708 и 2686704 в десятичной форме.

Возникает ряд вопросов, на которые вы можете ответить столько, сколько пожелаете.

  1. Почему q меньше p? Я ожидаю, что память будет назначена в порядке возрастания, но q < p.

  2. Почему адреса редко меняются? Несколько лет назад я запускал аналогичную программу, и я помню, что этот адрес тоже был 0x28fef4.

  3. Что представляет собой единица измерения в шестнадцатеричном значении? Немного? Байт?

  4. У меня около 8 ГБ памяти (ОЗУ). Почему значения p и q настолько малы по сравнению с моей емкостью памяти?

Не стесняйтесь отвечать на все или на все эти вопросы или предоставлять любую связанную информацию о указателях.

Спасибо.

ответ

6

Почему q меньше, чем p? Я ожидаю, что память будет назначена в порядке возрастания, но q < p.

Я не уверен, почему вы ожидаете этого. Какая возможная разница?

Почему адреса редко меняются? Я запускал аналогичную программу несколько часов назад, и я помню, что этот адрес тоже был 0x28fef4.

Очевидно, ваша платформа не рандомизирует адреса стека. То же самое, те же адреса.

Что представляет собой единица измерения в шестнадцатеричном значении? Немного? Байт?

Байт.

У меня около 8 ГБ памяти (ОЗУ). Почему значения p и q настолько малы по сравнению с объемом моей памяти?

Физическая память не имеет к этому никакого отношения. Это адреса виртуальной памяти, а не адреса физической памяти.

+0

Предполагаю, что я ожидал 'q'>' p', потому что я думаю о адресах, подобных коробке, или ведро. Вы заполняете '0x28fef4'' a', а затем кладете 'b' поверх него, еще 4 байта вверх. Я ищу физическую значимость числа '2686708'. Если я думаю об этом не так, как правильно об этом думать? – Johan

+1

@DaaaahWhoosh Единица в шестнадцатеричном представлении - 4 бита. Байт обычно (но не всегда) 8 бит. –

+0

@DaaaahWhoosh Одна единица в шестнадцатеричном представлении равна четырем в двоичном представлении. – Columbo

0

Я хотел бы ожидать памяти быть назначены в порядке возрастания

Это ожидание является абсолютно необоснованным.Компиляторы не заказывают вещи в соответствии с порядком их появления в исходном коде или других незначительных деталях.

Почему адреса редко меняются?

Подобные фрагменты исходного кода часто переводятся на аналогичные фрагменты целевого кода. Что тут удивительно?

Что представляет собой единица измерения в шестнадцатеричном значении? Немного? Байт?

Байт (но, пожалуйста, имейте в виду, что «шестнадцатеричное значение» является неправильным, значения являются целыми числами, обозначение - шестнадцатеричным).

Почему значения р и д настолько малы

переменные являются автоматическими, что является C способ сказать «они находятся на стеке». Ваш компилятор выделяет стек рядом с началом пространства аддонов виртуальной памяти. Каждая программа имеет свое собственное адресное пространство виртуальной памяти, поэтому все в порядке, когда две программы, которые работают одновременно, занимают один и тот же диапазон виртуальных адресов.