Zeiger funktioniert nicht in printf()

Lesezeit: 2 Minuten

Ich habe ein Problem mit dem Drucken eines Zeigers. Jedes Mal, wenn ich versuche, das folgende Programm zu kompilieren, erhalte ich die folgende Fehlermeldung:

pointers.c:11: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘int *’

Mir fehlt hier offensichtlich etwas Einfaches, aber von anderen Beispielen mit ähnlichem Code, die ich gesehen habe, sollte dies funktionieren.

Hier ist der Code, jede Hilfe wäre großartig!

#include <stdio.h>

    int main(void)
    {
       int x = 99;
       int *pt1;

       pt1 = &x;

       printf("Value at p1: %d\n", *pt1);
       printf("Address of p1: %p\n", pt1);

       return 0;
    }

  • Die Warnbeschreibung scheint mir in Ordnung zu sein. Setzen Sie es auf void, bevor Sie es an printf senden. statt pt1, (void*)pt1

    – Mailand

    24. März 2011 um 10:51 Uhr

  • Versuchen Sie, pt1 ein kaufmännisches Und hinzuzufügen, und sehen Sie, ob das funktioniert.

    – Nachtaktiv

    24. März 2011 um 10:51 Uhr

Setzen Sie einfach Ihren int-Zeiger auf einen leeren:

printf( "Address of p1: %p\n", ( void * )pt1 );

Ihr Code ist sicher, aber Sie kompilieren mit dem -Wformat Warnflag, das die Aufrufe überprüfen wird printf() und scanf().

  • Oh ok. Ich bin neu in C und hatte bis jetzt nicht gelernt, zwischen Compiler-Nachrichtentypen zu unterscheiden. Vielen Dank.

    – Chris

    24. März 2011 um 10:57 Uhr


  • Dieses Verhalten wurde von gcc-Entwicklern als gültig bestimmt, siehe gcc.gnu.org/bugzilla/show_bug.cgi?id=26542 Siehe auch eine ausführliche Erklärung von Jonathan Leffler: stackoverflow.com/questions/9053658/…

    – Alex Cohn

    3. September 2012 um 9:06 Uhr


Benutzeravatar von pmg
pmg

Beachten Sie, dass Sie eine einfache Warnung erhalten. Ihr Code wird wahrscheinlich wie erwartet ausführen.

Das "%p" Konvertierungsspezifizierer zu printf erwartet a void* Streit; pt1 ist vom Typ int*.

Die Warnung ist gut, weil int* und void* kann bei seltsamen Implementierungen unterschiedliche Größen oder Bitmuster haben oder so.

Konvertieren Sie die int* zu einem void* mit Gips …

printf("%p\n", (void*)pt1);

… und alles wird gut, auch bei seltsamen Implementierungen.

  • Selbst wenn sie die gleiche Größe haben, können sie unter einer seltsamen Aufrufkonvention unterschiedlich an die aufgerufene Funktion übermittelt werden.

    – Café

    24. März 2011 um 12:11 Uhr

  • Danke @caf, Antwort überprüft, um zu decken ALLE Fälle 🙂

    – pmg

    24. März 2011 um 12:35 Uhr


In diesem Fall ist der Compiler nur etwas übereifrig mit den Warnungen. Ihr Code ist absolut sicher, Sie können die Warnung optional entfernen mit:

printf("Address of p1: %p\n", (void *) pt1);

Die Nachricht sagt alles, aber es ist nur eine Warnung, kein Fehler an sich:

printf("Address of p1: %p\n", (void*)pt1);

Das hat bei mir ganz gut funktioniert:

printf("Pointer address: %p.", pxy);

Sie müssen es nicht als irgendetwas darstellen, es sei denn, Sie wollten …

1387510cookie-checkZeiger funktioniert nicht in printf()

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

Privacy policy