Вывести адрес или указатель на значение в C - PullRequest
76 голосов
/ 29 июня 2009

Я хочу сделать что-то, что кажется довольно простым. Я получаю результаты, но проблема в том, что у меня нет возможности узнать, верны ли результаты.

Я работаю в Си, и у меня есть два указателя; Я хочу напечатать содержимое указателя. Я не хочу разыменовывать указатель, чтобы получить указанное значение, я просто хочу адрес, который хранит указатель.

Я написал следующий код, и мне нужно знать, правильно ли он, а если нет, как я могу его исправить.

/* item one is a parameter and it comes in as: const void* item1   */
const Emp* emp1 = (const Emp*) item1; 

printf("\n comp1-> emp1 = %p; item1 = %p \n", emp1, item1 );

Пока я публикую это (и это важно, потому что это правильно), мне нужно в конечном итоге сделать это для указателя на указатель. То есть:

const Emp** emp1 = (const Emp**) item1; 

Ответы [ 6 ]

38 голосов
/ 29 июня 2009

Для печати адреса в указателе на указатель:

printf("%p",emp1)

разыменовать один раз и напечатать второй адрес:

printf("%p",*emp1)

Вы всегда можете проверить с помощью отладчика, если вы используете linux, используете ddd и отображаете память, или просто просто gdb, вы увидите адрес памяти, чтобы вы могли сравнить со значениями в ваших указателях.

28 голосов
/ 29 июня 2009

То, что у вас есть, правильно. Конечно, вы увидите, что emp1 и item1 имеют одинаковое значение указателя.

14 голосов
/ 29 июня 2009

Я считаю, что это было бы наиболее правильно.

printf("%p", (void *)emp1);
printf("%p", (void *)*emp1);

printf() - это функция с переменным числом аргументов, и ей должны передаваться аргументы правильных типов. Стандарт гласит: %p принимает void *.

9 голосов
/ 29 июня 2009

Поскольку вы, кажется, уже решили основной адрес указателя, вот как вы можете проверить адрес двойного указателя:

char **a;
char *b;
char c = 'H';

b = &c;
a = &b;

Вы сможете получить доступ к адресу двойного указателя a, выполнив:

printf("a points at this memory location: %p", a);
printf("which points at this other memory location: %p", *a);
4 голосов
/ 11 марта 2013
char c = 'A';
printf("ptr: %p,\t value: %c,\t and also address: %zu",&c, c,&c);

результат:

ptr: 0xbfb4027f, значение: A, а также адрес: 3216245375

0 голосов
/ 29 июня 2009

Я был в этом положении, особенно с новым оборудованием. Я предлагаю вам написать небольшую собственную процедуру шестнадцатеричного дампа. Вы сможете увидеть данные и адреса, по которым они отображаются, все вместе. Это хорошая практика и построение доверия.

...