Geben Sie die Adresse oder den Zeiger für den Wert in C aus

Lesezeit: 3 Minuten

Benutzeravatar von Frank V
Frank v

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 was ich wissen muss, ist, ob er richtig ist und wenn nicht, wie kann ich ihn 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 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; 

  • Was du geschrieben hast, ist richtig, welches Problem hast du genau?

    – Luca Matteis

    28. Juni 2009 um 22:53 Uhr

  • Wie ich beschrieben habe, bekam ich Ergebnisse, hatte aber keine Möglichkeit zu 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

    29. Juni 2009 um 1:30 Uhr

Adresse in Pointer-to-Pointer drucken:

printf("%p",emp1)

um einmal zu dereferenzieren und die zweite Adresse zu drucken:

printf("%p",*emp1)

Sie können jederzeit mit dem Debugger überprüfen, ob Sie Linux verwenden ddd und Anzeigespeicher oder einfach nur gdbsehen Sie die Speicheradresse, damit Sie sie mit den Werten in Ihren Zeigern vergleichen können.

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

  • Sie sind nicht gleich, wenn der Typ von item1 Teil einer Mehrfachvererbung und/oder ein Vorfahre von Emp ist, je nachdem, wie der Compiler jede der Klassen anlegt, die den Typ von item1 bilden.

    – Jim Buck

    28. Juni 2009 um 23:28 Uhr

  • @ Jim: Das “C” -Tag schlägt etwas anderes vor

    – Hasturkun

    28. Juni 2009 um 23:43 Uhr

  • @Jim: Hasturkun hat recht. Ich arbeite in C. Ich hätte das posten sollen.

    – Frank v

    29. Juni 2009 um 3:11 Uhr

Benutzeravatar von sigjuice
Sigisaft

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 Typen übergeben werden. Die Norm sagt %p nimmt void *.

  • Ich könnte mir vorstellen, dass sie befördert werden? Ich bin mir nicht sicher, kann jemand das klären?

    – RastaJedi

    2. April 2016 um 5:37 Uhr

  • Nach einiger Recherche nein, sie werden nicht automatisch befördert. Eine Besetzung zu void * ist in der Tat erforderlich.

    – RastaJedi

    2. April 2016 um 6:04 Uhr

Benutzeravatar von Luca Matteis
Luca Matteis

Da Sie die grundlegende Zeigeradressenanzeige bereits gelöst zu haben scheinen, würden Sie wie folgt die Adresse eines Doppelzeigers überprüfen:

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

b = &c;
a = &b;

Sie könnten auf die Adresse des Doppelzeigers zugreifen a dadurch:

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

Benutzeravatar von 4pie0
4pie0

char c="A";
printf("ptr: %p,\tvalue: %c,\tand also address: %zu", &c, c, &c);

Ergebnis:

ptr: 0x7ffc48e5105f,    value: A,    and also address: 140721531457631

Benutzeravatar von gbarry
gbarry

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, alle zusammen sehen. Es ist eine gute Übung und ein Vertrauensbildner.

1418380cookie-checkGeben Sie die Adresse oder den Zeiger für den Wert in C aus

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy