2009-06-28 3 views
69

Ich möchte etwas tun, das ziemlich einfach scheint. Ich bekomme Ergebnisse, aber das Problem ist, ich habe keine Möglichkeit zu wissen, ob die Ergebnisse korrekt sind.Drucken Sie die Adresse einen Zeiger enthält in C

Ich arbeite in C und ich habe zwei Zeiger; Ich möchte den Inhalt des Zeigers ausdrucken. Ich möchte den Zeiger nicht dereferenzieren, um den Wert, auf den gezeigt wird, zu erhalten, ich möchte nur die Adresse, die der Zeiger gespeichert hat.

Ich habe den folgenden Code geschrieben und was ich wissen muss ist, ob es richtig ist und wenn nicht, wie kann ich es korrigieren.

/* 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); 

Während ich dieses Posting (und der Grund, warum es wichtig ist, dass es richtig ist) ist, dass ich schließlich dieses a-Zeiger Zeiger auf eine Notwendigkeit zu tun. Das ist:

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

Was Sie geschrieben richtig ist, welches Problem auftritt Sie genau? –

+0

Wie ich beschrieben habe, bekam ich Ergebnisse, aber ich hatte keine Möglichkeit zu wissen, ob die Ergebnisse korrekt waren oder ob es mir Unsinn gab. Don und andere unten (und auch Sie selbst) haben bestätigt, dass diese Ergebnisse gültig sind. –

Antwort

24

Was Sie haben, ist richtig. Natürlich werden Sie sehen, dass emp1 und item1 denselben Zeigerwert haben.

printf("%p",emp1) 

zu dereferenzieren einmal und drucken die zweite Adresse:

+1

Sie sind nicht identisch, wenn der Typ von Element1 Teil einer Mehrfachvererbung und/oder ein Vorgänger von Emp ist, abhängig davon, wie der Compiler jede der Klassen, die den Typ von Element1 bilden, darstellt. –

+2

@Jim: Das "C" -Tag schlägt anders vor – Hasturkun

+1

@Jim: Hasturkun ist richtig. Ich arbeite in C. Ich hätte das schreiben sollen. –

34

Um Adresse in Zeiger auf Zeiger drucken

printf("%p",*emp1) 

Sie können jederzeit mit Debugger überprüfen, wenn Sie auf Linux sind ddd und Speicher anzeigen, oder nur einfach gdb, Sie werden die Speicheradresse sehen, so dass Sie mit den Werten in Ihren Zeigern vergleichen können.

+0

das ist das gleiche wie in dem Code, den Frank gepostet hat. –

+0

Nun dachte ich, er fragte, ob es korrekt ist ... – stefanB

8

Da Sie bereits scheinen die Basiszeigeradressanzeige gelöst zu haben, ist hier, wie Sie die Adresse eines Doppelzeiger überprüfen würde:

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

b = &c; 
a = &b; 

Sie wäre in der Lage, die Adresse des Doppel Zeiger zuzugreifen a durch doing:

+0

'printf (" was enthält diesen Wert:% c \ n "** a);' wollte nur das ^.^Hinzufügen. – RastaJedi

13

Ich glaube, das wäre am richtigsten.

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

printf() ist eine variadische Funktion und muss Argumente der richtigen Arten übergeben werden. Der Standard sagt %p dauert void *.

+0

Ich würde mir vorstellen, dass sie befördert werden? Nicht sicher, kann jemand klären? – RastaJedi

+2

Nach einigen Recherchen, nein, sie werden nicht automatisch befördert. Ein Cast auf 'void *' ist in der Tat erforderlich. – RastaJedi

0

Ich war in dieser Position, vor allem mit neuer Hardware. Ich schlage vor, Sie schreiben eine eigene Hex-Dump-Routine. Sie können die Daten und die Adressen, an denen sie sich befinden, zusammen anzeigen lassen. Es ist eine gute Übung und ein Vertrauenserzeuger.

+3

auf Kosten von Ignorant klingen - könnten Sie näher darauf eingehen, wie man eine solche Routine schreibt? –

+0

Auch diese Antwort mag besser als Kommentar geeignet sein? – RastaJedi

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

Ergebnis:

ptr: 0xbfb4027f, Wert: A, und auch Adresse: 3216245375

Verwandte Themen