2012-05-15 14 views

ответ

5

i находится в стеке, а кусок памяти, на который указывает, находится в куче. На вашей платформе это две совершенно разные области памяти, и он просто так случается куча addess является относительно низкой, численно, поэтому он имеет много ведущих нулей, которые не показаны, т.е.

&i = 0x7fff38fed6a8; // stack 
i = 0x0000010f7010; // heap 
1

Нет необходимости в том, чтобы спецификатор форматирования %p выставлял выход на любую фиксированную длину. Таким образом, вы не можете выводить какую-либо информацию о «длине» в памяти адреса из печатного представления. Например, если вы сделаете это:

const void *nada = NULL; 

printf("NULL is at %p\n", nada); 

Вы можете также увидеть что-то вроде этого:

NULL is at 0x0 

Конечно, это вовсе не означает, что void * тип волшебно занимая только 4 бита, когда значение NULL, это просто означает, что когда значение указателя было преобразовано в строку, ведущие нули были опущены.

UPDATE: Не прочитанный код вопроса, я удалил ненужный текст.

+0

@PaulR: Да, неправильно прочитайте код вопроса. Спасибо, исправлено! – unwind

4

i - адрес в куче, а &i - это адрес в стеке. Куча и стек занимают разные диапазоны адресов, поэтому вы видите разные числа.

Указатели на самом деле не разные длины: более коротким предшествуют нули. Вероятно, вы запускаете это на 64-битной машине, поэтому каждый указатель имеет 64 бита (16 шестнадцатеричных цифр).

1

Это не короче, просто количество меньше. Указатель & i находится на стеке, и я нахожусь в куче.

1

В дополнение к другие ответы:

Поскольку вы не включили <stdlib.h> есть хороший шанс, что компилятор ошибочно предполагает, что таНос возвращает int, а не void*. Это, возможно, серьезная ошибка, которую вы скрыли с типом возвращаемого значения malloc. Прочитано this и this.

Если int имеет разную ширину, чем адресная шина вашей конкретной системы, например, на многих 16-битных или 64-битных процессорах, вы получите неверные результаты.