Скорее всего, параметр str
передается в регистр.Обычно он будет использоваться из этого регистра и никогда не будет существовать в стеке.Поскольку ваш код принимает адрес str
, компилятор вынужден поместить его в память где-нибудь, чтобы он мог предоставить адрес.Похоже, что компилятор сначала создал пространство для a
в стеке (или, по крайней мере, по более высокому адресу), а затем создал пространство для str
в стеке и скопировал значение из регистра в расположение стека.
Не следует ожидать, что проверка адресов объектов выявляет или отражает другие аспекты платформы, такие как ее двоичный интерфейс приложения (который, помимо прочего, определяет, как передаются параметры функции) или как управляется стек.Реализация AC может свободно перестраивать вещи, пока получающаяся программа достигает того же наблюдаемого поведения , как определено стандартом C, и современные реализации C могут выполнять большие и неожиданные преобразования при оптимизации программ.Наблюдаемое поведение включает определенные выходные данные программы, но не включает никаких правил упорядочения адресов объектов.
Кстати, в отношении вашего последнего вопроса, да, вы печатаете адреса неправильно.Чтобы напечатать адрес, приведите его к void *
и напечатайте его с %p
, а не %X
.