Этот код:
int *x,q;
...
x=0x7fffffffe2bc;
недействителен.Это нарушение ограничения, означающее, что любой соответствующий компилятор должен выдавать диагностическое сообщение.Вы сказали «При компиляции этой программы нет предупреждений / ошибок», что означает, что либо вы используете старый компилятор, либо вы используете новый компилятор неправильно.
x
имеет тип int*
;0x7fffffffe2bc
имеет некоторый целочисленный тип.Не существует неявного преобразования целочисленного типа в int*
(за исключением специального случая 0
, константы нулевого указателя).
Вы можете легально написать что-то вроде:
x = (int*)0x7fffffffe2bc;
но это очень плохая идея.Это делает вашу программу чрезвычайно непереносимой.Это может (или не может) произойти с вашей конкретной системой.
Что бы вы ни пытались сделать, это не способ сделать это.У вас нет возможности узнать, что 0x7fffffffe2bc
(при преобразовании в int*
) является действительным адресом - и даже если это действительный адрес, этого не произойдет, если вы запустите программу даже в немного другой среде.
РЕДАКТИРОВАТЬ :
Я попытался воспроизвести вашу программу в моей системе (где адреса совершенно разные), напечатав адреса q
и w
, а затемвстраивание адресов в код.Фактический адрес меняется каждый раз, когда я запускаю программу, даже когда я не изменяю и не перекомпилирую саму программу.Я думаю, что некоторые системы делают это намеренно, как средство защиты.(Я вижу, что в ответе dmckee это уже упоминалось.)
Печать адреса переменной или просмотр его с помощью gdb сообщают только адрес этой переменной в данном конкретном выполнении программы.Как только программа завершит работу, эта информация будет бесполезной , даже если вы перезапустите ту же программу без изменений.
Если вам нужен адрес q
, способ получитьэто &q
.