2009-06-28 2 views
69

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

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

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

/* 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; 
+0

То, что вы написали правильно, какие проблемы вы испытываете именно? –

+0

Как я описал, я получал результаты, но не имел возможности узнать, были ли результаты правильными или если это давало мне мусор. Дон и другие ниже (а также вы сами) подтвердили, что эти результаты действительны. –

ответ

24

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

+1

Они не будут одинаковыми, если тип item1 является частью множественного наследования и/или является предком Emp, в зависимости от того, как компилятор выставляет каждый из классов, которые составляют тип item1. –

+2

@Jim: Тег «C» предлагает иначе – Hasturkun

+1

@Jim: Хастуркун прав. Я работаю в C. Мне следовало бы разместить это. –

34

Чтобы напечатать адрес в указатель на указатель:

printf("%p",emp1) 

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

printf("%p",*emp1) 

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

+0

это то же самое, что и в коде Frank. –

+0

Я думал, что он спросил, правильно ли это ... – stefanB

8

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

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

b = &c; 
a = &b; 

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

printf("a points at this memory location: %p", a); 
printf("which points at this other memory location: %p", *a); 
+0

'printf (", который содержит это значение:% c \ n "** a);' просто хотел добавить это ^. ^. – RastaJedi

13

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

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

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

+0

Я бы предположил, что они продвигаются? Не уверен, может кто-то уточнить? – RastaJedi

+2

После некоторых исследований, нет, они не продвигаются автоматически. Приведение к 'void *' действительно требуется. – RastaJedi

0

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

+3

за счет звучания невежественного - не могли бы вы рассказать о том, как писать такую ​​рутину? –

+0

Также этот ответ лучше подходит для комментариев? – RastaJedi

3
char c = 'A'; 
printf("ptr: %p,\t value: %c,\t and also address: %zu",&c, c,&c); 

результат:

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

Смежные вопросы