2015-04-18 4 views
1
#include<stdio.h> 
main() { 
    int i=9; 

    printf("\nAddress of i = %d", &i); 
    printf("\nAddress of i = %x", &i); 
    printf("\nAddress of i = %u", &i); 
    printf("\nAddress of i = %p", &i); 
    printf("\nValue of i = %d",i); 
} 

Когда я использую %p я получаю: Значение i = 0xbfd08d5c
Другие форматы %d, %x, %u не работают.Вывести адрес переменной в памяти

+2

Это * кажется * как действительный адрес в памяти для меня. Что вы ожидаете увидеть? –

+0

@WaiHaLee Что-то вроде этого> Адрес i = 65524 Значение i = 3 – sunp

+0

Я пробовал это упражнение: main() { { int i = 3; Е ("\ nAddress из I =% U", &i) ; Е ("\ nValue из I =% D", я); Е ("\ nValue из I =% d", * (& я)); } Выходной сигнал вышеуказанной программы будет: Адрес i = 65524 Значение i = 3 – sunp

ответ

5

В целом, вы не можете использовать %d, %x, или %u по адресу. Вы должны использовать только %p - это единственный допустимый формат, используемый для указателей.

Кроме того, поскольку %p ожидает пустой указатель, вам нужно добавить бросок к &i операции:

printf("\nAddress of i = %p", (void*)&i); 

Хотя код будет работать без гипса на большинстве платформ, это хорошая идея, чтобы добавить чтобы гарантировать совместимость с платформами, где указатель на int и указатель пустоты имеют разные представления. Я не уверен, что есть такие платформы, но стандарт не запрещает их.

+0

проверить это: http://www.programiz.com/c-programming/c-pointers – sunp

+0

Я понимаю, что другие форматы не разрешены, кроме% p, но что, если я просто хочу напечатать адрес местоположения в целочисленном виде, как показано в приведенной выше ссылке. Теперь, как он печатает адрес в int: look @ link выше. – sunp

+1

@sunnyp., Эта статья неверно. '% d' ожидает, что' int', но '& var' имеет тип' int * '. Если вы посмотрите на стандарт C11, 7.21.6.1, 9)« Если спецификация преобразования недействительна, поведение не определено , ** Если какой-либо аргумент неправильный тип для соответствующей спецификации преобразования, поведение равно undefined. ** «Итак, если вы используете'% d' для печати адреса, ваш код демонстрирует неопределенное поведение. –

-1
Адрес

- положительное целое число, поэтому с помощью «% u», то есть без знака int, можно напечатать правильное значение адреса.

p.s., "% p" в шестнадцатеричном формате и "% u" в общем десятичном формате.

+0

В большинстве 64-битных систем результат будет неверно, если вы печатаете адрес как 'unsigned int'. – alk

+0

unsigned может использоваться как для int, так и для long. – lxg

+0

'% u' предназначен только для 'unsigned int'. Чтобы напечатать' unsigned long int' модификатор длины 'l', должен использоваться, давая '% lu'. – alk