Wie drucke ich variable Adressen in C?

Lesezeit: 4 Minuten

Benutzeravatar von nambvarun
nambvarun

Wenn ich diesen Code ausführe.

#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

Benutzeravatar von Carl Norum
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.

Und vergessen Sie nicht die Besetzung, zB

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

  • das dachte ich ursprünglich, aber das Tutorial auf dieser Website (cis.temple.edu/~ingargio/cis71/code/addresses.c) sagt mir, ich solle %d verwenden… ist das falsch.

    – Nambvarun

    12. März 2011 um 23:58 Uhr


  • @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

Benutzeravatar von Amarendra Deo
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.

    – Alexander

    20. März 2018 um 3:15 Uhr

Sieht so aus, als ob Sie %p verwenden: Zeiger drucken

Ich habe es im Online-Compiler versucht
https://www.onlinegdb.com/online_c++_compiler

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;
}

1412320cookie-checkWie drucke ich variable Adressen in C?

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

Privacy policy