Я практикуюсь на языке программирования C. У меня была система Win 10, и я практиковался на ней, и всегда получаю адреса, кратные 2. Знаете, я тренируюсь на Macbook Pro M3 и получаю 9-значные адреса. Итак, девять – нечетно.
Также вот код и результат:
#include <stdio.h>
int main(void)
{
int m = 10, n, o, *z;
z = &m;
printf("z stores the address of m = %p\n", z);
printf("*z stores the value of m = %d\n", *z);
printf("&m is the address of m = %p\n", &m);
printf("&n stores the address of n = %p\n", &n);
printf("&o stores the address of o = %p\n", &o);
printf("&z stores the address of z = %p\n", &z);
return 0;
}
z stores the address of m = 0x16fa13228
*z stores the value of m = 10
&m is the address of m = 0x16fa13228
&n stores the address of n = 0x16fa13224
&o stores the address of o = 0x16fa13220
&z stores the address of z = 0x16fa13218
Я исследовал это, но не смог получить хороших ответов. Вот что я нашел:
почему значение адреса в c всегда четное?
Странный адрес переменной C в Mac OS X
Я ожидал увидеть адреса в четных цифрах.
Re: «Я ожидал увидеть адреса, состоящие из нескольких цифр»: девять цифр — это несколько цифр. Re «Win 10… Я всегда получаю адреса, кратные 2»: вы имеете в виду, что количество цифр кратно двум? Нет особой причины, по которой количество шестнадцатеричных цифр в адресе должно быть кратно двум. Мы часто представляем адреса с помощью восьмибитных байтов, а восемь бит эквивалентны двум шестнадцатеричным цифрам, поэтому, если шестнадцатеричная цифра не равна нулю, число цифр будет четным (например, восемь для 32 битов, 16 для 64). . Но первая цифра может быть нулем и оставлять нечетное число.
Если быть педантичным, то шестнадцатеричные числа называются гекситами. Но в девятнадцатеричном числе нет ничего странного. Вы можете дополнить его нулями слева до любой ширины, которая вам нравится.
Мерт: Можете ли вы уточнить, что означает фраза «Я ожидал увидеть адреса, состоящие из нескольких цифр»? Я ответил на вопрос, который, как мне казалось, вы задали, но, возможно, вас действительно интересует что-то другое.
Привет, большое спасибо за вашу помощь. Я хотел сказать четные цифры, а не кратные.





У меня была система Win 10, я тренировался на ней и всегда получал адреса, кратные 2
Знаете, я тренируюсь на Macbook Pro M3 и получаю 9-значные адреса.
Оно не зависит от количества цифр, а только от значения этого числа.
Пример: 0x16fa13228 — это 6167802408 в десятичном формате. Это число делится на 2.
На самом деле проще увидеть делимость на степени 2 в шестнадцатеричном виде: завершающая шестнадцатеричная цифра 8 означает, что это число делится на 2, 4 и 8.
Из проекта C23:
7.23.6.1 Функция fprintf
- Спецификаторы преобразования и их значения:
pАргумент должен быть указателем на void или указателем на тип символа. Значение указателя преобразуется в последовательность печатных символов способом, определяемым реализацией.
Это означает, что разные реализации могут выдавать разные выходные данные, даже если фактические значения указателей окажутся одинаковыми.
Я ожидал увидеть адреса в четных цифрах.
Я предполагаю, что это означает, что вы ожидали увидеть четное количество цифр. Обычно печатается не более значащих цифр, отличных от нуля, поэтому, если на вашем Mac вы получаете 9 цифр, это всего лишь результат этого. 32-битный адрес, например 0x00000FFF, часто будет печататься как 0xFFF.
Если вам нужен один и тот же формат на всех платформах и реализациях, вы можете вместо этого привести указатель на uintptr_t и распечатать его.
Пример:
#include <inttypes.h> // PRIxPTR
#include <stdint.h> // uintptr_t
//...
printf("&n stores the address of n = 0x%016" PRIxPTR "\n", (uintptr_t)&n);
Возможный результат:
&n stores the address of n = 0x000000016fa13224
Это кажется глупым — почему вы ожидаете, что указатели будут одинаковыми? Это разные архитектуры и разные операционные системы.
@NickODell Я не ожидаю, что указатели будут одинаковыми. Я сказал, что даже если они оказались одинаковыми, разные реализации могут представлять их по-разному. Является ли это недоразумение той частью, которая привлекает отрицательные голоса?
Я не обязательно согласен с тем, что это определяется реализацией. Это просто не имеет отношения к рассматриваемому вопросу. Если бы ОП спросил, как заставить распечатывать указатели с четным количеством цифр, я был бы полностью согласен с этим ответом. Но вопрос здесь кажется концептуальным.
@NickODell Хорошо, спасибо. Я добавил примечание, чтобы более четко объяснить, о чем, по моему мнению, идет речь в вопросе ОП.
Я думаю, что вопрос ОП более вероятен, почему адрес имеет то значение, которое он имеет, то есть «девятизначный адрес», например 0x16fa13224, а не восьмизначный адрес, такой как 0xff003224, или шестнадцатизначный адрес, такой как 0x800000006fa13224, как ОП видел на другая система, чем то, почему адрес отформатирован определенным образом. И ответ в том, что загрузчик программы предназначен для разного распределения памяти в разных системах, и это не имеет ничего общего с форматированием адресов.
@EricPostpischil О, я это не так интерпретировал, но да, вполне возможно, что это то, о чем на самом деле спрашивает ОП. Я попросил разъяснений по поводу последней части вопроса (что меня немного смущает).
Всем привет. Я очень ценю вашу помощь. Ты лучший 🥳
Я думаю, вам нужно уточнить свой вопрос. Я не вижу ничего странного в выводе, который вы видите.