Как адреса указателей могут иметь разную длину?
Я только что выполнил этот пример кода:
int *i = (int*) malloc( sizeof(int) );
printf( "%p, %p\n", &i , i );
и вот что я получил:
0x7fff38fed6a8, 0x10f7010
Интересно, почему второй адрес короче первого?
5 ответов
i
находится в стеке, в то время как кусок памяти, на который он указывает, находится в куче. На вашей платформе это две очень разные области памяти, и так получилось, что аддитивная куча относительно мала, численно, поэтому у нее много ведущих нулей, которые не показаны, т.е.
&i = 0x7fff38fed6a8; // stack
i = 0x0000010f7010; // heap
i
это адрес в куче, а &i
это адрес в стеке. Куча и стек занимают разные диапазоны адресов, поэтому вы видите разные числа.
Указатели на самом деле не имеют разную длину: более короткому предшествуют нули. Вы, вероятно, выполняете это на 64-битной машине, поэтому каждый указатель имеет 64 бита (16 шестнадцатеричных цифр).
Это не короче, просто число меньше. Указатель и я в стеке, и я в куче.
В дополнение к другим ответам:
Поскольку вы не включили <stdlib.h>
есть большая вероятность, что компилятор неверно полагает, что malloc возвращает int
скорее, чем void*
, Это, возможно, серьезная ошибка, которую вы скрыли с типом возвращаемого значения malloc. Прочитайте это и это.
Если int
имеет ширину, отличную от адресной шины в вашей конкретной системе, например, на многих 16-битных или 64-битных процессорах вы получите неверные результаты.
Не требуется, чтобы %p
спецификатор форматирования дополняет вывод до любой фиксированной длины. Таким образом, вы не можете вывести какую-либо информацию о "длине" адреса в памяти из печатного представления. Например, если вы делаете это:
const void *nada = NULL;
printf("NULL is at %p\n", nada);
Вы можете увидеть что-то вроде этого:
NULL is at 0x0
Конечно, это не значит, что void *
Тип магически занимает только 4 бита, когда значение NULL
, это просто означает, что когда значение указателя было преобразовано в строку, начальные нули были опущены.
ОБНОВЛЕНИЕ: неправильно прочитал код вопроса, я удалил несоответствующий текст.