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.
-
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.