Как адреса указателей могут иметь разную длину?

Я только что выполнил этот пример кода:

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, это просто означает, что когда значение указателя было преобразовано в строку, начальные нули были опущены.

ОБНОВЛЕНИЕ: неправильно прочитал код вопроса, я удалил несоответствующий текст.

Другие вопросы по тегам