Drucken Sie die Adresse oder den Zeiger für den Wert in C.

79

Ich möchte etwas tun, das ziemlich einfach erscheint. Ich erhalte Ergebnisse, aber das Problem ist, dass ich nicht wissen kann, ob die Ergebnisse korrekt sind.

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

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

/* 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 dies poste (und der Grund, warum es wichtig ist, dass es korrekt ist), ist, dass ich dies schließlich für einen Zeiger auf einen Zeiger tun muss. Das ist:

const Emp** emp1 = (const Emp**) item1; 
Frank V.
quelle
Was Sie geschrieben haben, ist richtig. Welches Problem haben Sie genau?
Luca Matteis
Wie ich beschrieben habe, habe ich Ergebnisse erhalten, konnte aber nicht wissen, ob die Ergebnisse korrekt waren oder ob es mir Müll gab. Don und andere unten (sowie Sie selbst) haben bestätigt, dass diese Ergebnisse gültig sind.
Frank V

Antworten:

29

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

Don Neufeld
quelle
1
Sie sind nicht identisch, wenn der Typ von item1 Teil einer Mehrfachvererbung ist und / oder ein Vorfahr von Emp ist, je nachdem, wie der Compiler jede der Klassen auslegt, aus denen der Typ von item1 besteht.
Jim Buck
2
@ Jim: Das "C" -Tag schlägt etwas anderes vor
Hasturkun
1
@ Jim: Hasturkun ist richtig. Ich arbeite in C. Ich hätte das posten sollen.
Frank V
38

So drucken Sie die Adresse in Zeiger auf Zeiger:

printf("%p",emp1)

einmal dereferenzieren und die zweite Adresse ausdrucken:

printf("%p",*emp1)

Sie können jederzeit mit dem Debugger überprüfen, ob Sie Linux verwenden dddund Speicher anzeigen oder einfach nur gdbdie Speicheradresse sehen, damit Sie sie mit den Werten in Ihren Zeigern vergleichen können.

stefanB
quelle
16

Ich glaube, das wäre am richtigsten.

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

printf()ist eine variable Funktion und muss Argumente der richtigen Typen übergeben werden. Der Standard sagt %pnimmt void *.

Sigjuice
quelle
Ich würde mir vorstellen, dass sie befördert werden? Nicht sicher, kann jemand klarstellen?
RastaJedi
4
Nach einigen Recherchen werden sie nicht automatisch beworben. Eine Besetzung von void *ist in der Tat erforderlich.
RastaJedi
10

Da Sie die Anzeige der grundlegenden Zeigeradresse anscheinend bereits gelöst haben, überprüfen Sie die Adresse eines Doppelzeigers folgendermaßen:

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

b = &c;
a = &b;

Sie können auf die Adresse des Doppelzeigers zugreifen, aindem Sie Folgendes tun:

printf("a points at this memory location: %p", a);
printf("which points at this other memory location: %p", *a);
Luca Matteis
quelle
printf("which contains this value: %c\n" **a);wollte nur das hinzufügen ^. ^.
RastaJedi
4
char c = 'A';
printf("ptr: %p,\t value: %c,\t and also address: %zu",&c, c,&c);

Ergebnis:

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

4pie0
quelle
0

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

gbarry
quelle
3
auf Kosten des ignoranten Klangs - könnten Sie näher erläutern, wie man eine solche Routine schreibt?
Faisal Vali
1
Auch diese Antwort kann besser als Kommentar geeignet sein?
RastaJedi