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
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 …
13875100cookie-checkZeiger funktioniert nicht in printf()yes
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