Speicheradressen auslesen



  • mahlzeit miteinander!

    wollte gerade (laut buch) die speicheradressen von einer variable auslesen.

    im buch steht:
    [quote]
    c bietet dem programmierer die möglichkeit, auf die adressen zuzugreifen. dazu dient der adressoperator (referenzoperator) "&".

    folgendes beispiel gibt zunächst die adresse von x und anschließend den inhalt von x aus:

    int main(void)
    {
    int x = 10;
    
    printf("die adresse von x = %p \n", x);
    printf("der inhalt von x = %i \n, x);
    

    [quote]

    mal abgesehen davon, dass ich statt %i ein %d genommen habe.
    hat der autor nun den adressoperator im beispiel vergessen oder...?

    und warum kommen zwei unterschiedliche ergebnisse raus, wenn ich folgendes probiere?

    printf("Der Inhalt von x = %p \n", &x);
       printf("Die Adresse von x = %p \n", x);
    

    bitte auf anfängerniveau antworten 🙂

    vielen dank schon mal?



  • hat der autor nun den adressoperator im beispiel vergessen oder...?

    Wenn da nirgends ein "&" ist dann ja.. Nebenbeibemerkt fehlt auch ein Anführungszeichen.

    und warum kommen zwei unterschiedliche ergebnisse raus, wenn ich folgendes probiere?

    Weil der du mit "&x" die Addresse und mit "x" den Wert von x bekommst.
    In der ersten Zeile gibst du die Addresse von x aus, diese wird von printf als Addresse formatiert.
    In der zweiten Zeile gibst du den Wert von x aus, allerdings auch als Addresse formatiert.
    "%p" bedeutet nichts weiter als dass printf einen Parameter erwartet der dann als (32 oder 64Bit) Hex-Wert ausgegeben wird.


  • Mod

    Die Formatierungen im printf sind nur das: Formatierungen. Was ausgegeben wird, steht hinten. Im ersten, fehlerhaften, Beispiel wird zweimal der Wert von x ausgegeben, einmal als Adresse formatiert, einmal als dezimale Ganzzahl. Im zweiten Beispiel wird einmal die Adresse und dann der Wert von x ausgegeben, aber beide Male formatiert wie eine Adresse. Da Ganzzahlen und Adressen halbwegs kompatibel ist, funktioniert das sogar halbwegs. Normalerweise ist eine falsche Formatierung bei printf nicht so gut.



  • printf("Der Inhalt von x = %p \n", &x);
    printf("Die Adresse von x = %p \n", x);
    

    und als ergebnis kommt bei mir eben (von system zu system natürlich unterschiedlich)

    Der Inhalt von x = 0x22aacc 
    Die Adresse von x = 0xa
    

    und da beide ergebnisse wie speicheradressen aussehen, hat mich das natürlich gewundert.
    deswegen sah ich da keinen unterschied 😕



  • Aber auch da kann der Compiler helfen, indem man den Warnlevel richtig setzt und die Warnungen auch beachtet.


Anmelden zum Antworten