#include <stdio.h>
void moo(int a, int *b);
int main()
{
int x;
int *y;
x = 1;
y = &x;
printf("Address of x = %d, value of x = %d\n", &x, x);
printf("Address of y = &d, value of y = %d, value of *y = %d\n", &y, y, *y);
moo(9, y);
}
void moo(int a, int *b)
{
printf("Address of a = %d, value of a = %d\n", &a, a);
printf("Address of b = %d, value of b = %d, value of *b = %d\n", &b, b, *b);
}
Ich bekomme immer diesen Fehler in meinem Compiler.
/Volumes/MY USB/C Programming/Practice/addresses.c:16: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int *’
/Volumes/MY USB/C Programming/Practice/addresses.c:17: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int **’
/Volumes/MY USB/C Programming/Practice/addresses.c:17: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘int *’
/Volumes/MY USB/C Programming/Practice/addresses.c: In function ‘moo’:
/Volumes/MY USB/C Programming/Practice/addresses.c:23: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int *’
/Volumes/MY USB/C Programming/Practice/addresses.c:24: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int **’
/Volumes/MY USB/C Programming/Practice/addresses.c:24: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘int *’
Kannst du mir helfen?
Vielen Dank
bargmann
Die sagen “Warnung”, nicht “Fehler”. Das bedeutet, dass Ihr Programm weiterhin ausgeführt wird. Aber beheben Sie die Warnungen gemäß der Antwort unten.
– Jim Balter
13. März 2011 um 0:13 Uhr
Karl Norum
Sie verwenden möchten %p um einen Zeiger zu drucken. Aus der Spezifikation:
p Das Argument soll ein Zeiger auf sein void. Der Wert des Zeigers wird in einer implementierungsdefinierten Weise in eine Folge von Druckzeichen umgewandelt.
@blargman, ja, es ist falsch. Möglicherweise können Sie die Dinge durch Typumwandlung zum Laufen zwingen, aber seitdem %d zum Drucken vorzeichenbehafteter Ganzzahlen ist, ist dies wahrscheinlich keine gute Wahl.
– Karl Norum
13. März 2011 um 0:00 Uhr
+1: … aber für die Portabilität (und um dem zu folgen SOLL aus dem Standard) vergessen Sie nicht, die Adresse zu casten. printf("%p\n",(void*)&a);
– pmg
13. März 2011 um 0:07 Uhr
@pmg, ist die Besetzung notwendig? Ich dachte, Konvertierungen zu und von void * sind sicher und automatisch in C (6.3.2.2 Absatz 1).
– Karl Norum
13. März 2011 um 0:12 Uhr
@Carl: In variadischen Funktionen kann der Compiler die Argumenttypen nicht mit den erwarteten Typen vergleichen. Die Besetzung zu void* ist nicht automatisch: Was in variadischen Funktionen automatisch ist, sind ein paar Ganzzahlen im unteren Bereich intund float zu double.
– pmg
13. März 2011 um 0:24 Uhr
Wenn Sie beabsichtigen, die Speicheradresse einer Variablen oder eines Zeigers zu drucken, verwenden Sie %d wird die Aufgabe nicht erfüllen und einige Kompilierungsfehler verursachen, da Sie versuchen, eine Zahl anstelle einer Adresse auszugeben, und selbst wenn dies funktioniert, haben Sie einen beabsichtigten Fehler, da eine Speicheradresse keine ist Nummer. der Wert 0xbfc0d878 ist sicher keine Nummer, sondern eine Adresse.
Was Sie verwenden sollten, ist %p. z.B,
#include<stdio.h>
int main(void) {
int a;
a = 5;
printf("The memory address of a is: %p\n", (void*) &a);
return 0;
}
Viel Glück!
Der Wert 0xbfc0d878 ist eine Zahl. (void*)0xbfc0d878 ist nicht. Und %p verwendet wahrscheinlich eine für Menschen lesbare Darstellung, die wie eine Zahl aussieht (normalerweise Hex), aber das bedeutet nicht, dass Zeiger Zahlen sind. (Übrigens, die Frage wurde vor mehr als 2 Jahren beantwortet.)
– Keith Thompson
13. Juni 2013 um 6:38 Uhr
Warum müssen wir zu werfen (void*)?
– Cristian Gutu
1. Februar 2019 um 16:23 Uhr
Amarendra Deo
Um die Adresse einer Variablen zu drucken, müssen Sie die verwenden %p Format. %d ist für vorzeichenbehaftete Ganzzahlen. Zum Beispiel:
#include<stdio.h>
void main(void)
{
int a;
printf("Address is %p:",&a);
}
Während dieser Code die Frage beantworten kann, bietet er zusätzlichen Kontext bzgl wie und warum es löst das Problem und würde den langfristigen Wert der Antwort verbessern.
int main()
{
cout<<"Hello World";
int x = 10;
int *p = &x;
printf("\nAddress of x is %p\n", &x); // 0x7ffc7df0ea54
printf("Address of p is %p\n", p); // 0x7ffc7df0ea54
return 0;
}
14123200cookie-checkWie drucke ich variable Adressen in C?yes
Die sagen “Warnung”, nicht “Fehler”. Das bedeutet, dass Ihr Programm weiterhin ausgeführt wird. Aber beheben Sie die Warnungen gemäß der Antwort unten.
– Jim Balter
13. März 2011 um 0:13 Uhr