Der Martin: Verständnisfrage zum Speicher

Beitrag lesen

Hallo Markus,

#include <stdio.h>

int main(void)    {
int a;
int b;

printf("a:%x b:%x\n", &a, &b);
printf("Distanz: %d\n", (b-a) );
}

  

> Wieso ergibt b-a eine riesige Zahl? Sollte es nicht 4 ergeben?  
  
Nein, du bildest nur die Differenz zweier nicht initialisierter Variablen.  
Aber aus der restlichen Darstellung \_vermute\_ ich, dass du in Wirklichkeit die Differenz der \_Speicheradressen\_ von a und b meinst.  
Dann dürftest du aber nicht (b-a) schreiben, sondern (&b - &a). Und, oh Wunder, da kommt 1 heraus.  
  
Merkwürdig? Nur auf den ersten Blick.  
  
Bei der Zeigerarithmetik in C wird nämlich immer der Datentyp berücksichtigt. Habe ich zum Beispiel sowas hier:  
  
 int  k;  
 int \*p = &k;  
 p++;  
  
dann sieht das so aus, als ob der Zeiger p (per Deklaration ein Zeiger auf int) zunächst auf den Speicherplatz verweist, in dem k abgelegt ist, dann um eins erhöht wird. Dieses "eins" ist aber auf CPU-Ebene in Wirklichkeit 1\*(sizeof(int) Bytes), also bei 32bit-Systemen in der Regel 4 Bytes.  
Bei der Subtraktion von Zeigern, die du wahrscheinlich im Sinn hattest, wird das Prinzip umgekehrt angewandt. (&b-&a) aus deinem Beispiel ergibt intern zunächst 4 Bytes, das entspricht wieder genau 1\*sizeof(int), also ist das Endergebnis 1.  
  

> Meine zweite Frage betrifft den Speicher. Würde ich nun Daten in eine Variable einlesen, mir die Adresse merken, das Programm beenden und wieder starten und die Daten von der vorher bekannten Adresse wieder auslesen, wären die Daten dann auf immer und ewig dort? (natürlich solange der PC läuft?)  
  
Naja, bedingt. Wenn der Speicherbereich in der Zwischenzeit nicht von einem anderen Prozess benutzt wurde, müssten die Daten noch unverändert da sein. Aber da du die Speicherverwaltung des Betriebssystems nicht unter Kontrolle hast, ist dieser Fall eher unwahrscheinlich.  
  

> Ich frage es mich deswegen, da bei einem vollen RAM doch alte Daten gelöscht werden, damit der Computer Platz für neue Daten hat, und man sich somit des Vorhandenseins der Daten doch gar nicht sicher sein darf?  
  
Eben. Naja, "gelöscht" wird normalerweise nichts - ein freier Speicherbereich wird einfach wieder einem Programm zugewiesen, wenn es Speicher anfordert. Was in diesem Bereich noch für Datenreste liegen, weiß keiner. Es können aber durchaus noch Arbeitsdaten eines Programms sein, das vorher lief und diesen Speicher benutzt hat.  
  
Ich hoffe, ich konnte etwas Klarheit schaffen. ;-)  
  
Schönen Feierabend,  
 Martin  

-- 
Auf jeden Menschen auf der ganzen Welt entfallen statistisch gesehen etwa 3000 Spinnen, wie Wissenschaftler jetzt festgestellt haben.  
Wer will meine haben? Denn ich will sie bstimmt nicht.