Re: [OT] Warum kein Speicherzugriffsfehler
Am Donnerstag, 14. Februar 2008 schrieb Martin Steigerwald:
> Hallo!
>
> Ich weiß, es ist off topic, aber ich bin jetzt grad so neugierig,
> dass ich trotzdem mal fragen möchte. Ausgehend von der Diskussion zum
> Speicherverbrauch von tab-basierten Konsolen bin ich bei einem
> Galileobuch gelandet, wo auch ein Absatz zum virtuellen Speicher drin
> ist und Speicher anfordern drin ist[1].
>
> Da ist nettes Beispiel zum Speicher anfordern drin und auch ne
> Erklärung, wie es zu einem Speicherzugriffsfehler kommen kann.
>
> Nun wollte ich das mal ausprobieren:
>
> martin@shambala> cat zugriffsfehler.c
> #include <stdlib.h>
> #include <stdio.h>
>
> int main()
> {
> char* puffer; // Variable deklarieren
> puffer = malloc(4096); // 4 KB = 4096 Bytes
> // anfordern
>
> // Nun kann der Speicherbereich benutzt werden
>
> printf("4 KB Addressraum belegt ab: %ld\n", puffer);
>
> free(puffer); // Speicherbereich
> // wieder freigeben
>
> // Jeder Zugriff, der nach dem Freigeben auf den
> // Speicherbereich der Variable 'puffer'
> // erfolgt, führt zu einem Speicherzugriffsfehler
>
> printf("Zeiger auf den Speicher nach dem free(): %ld\n", puffer);
>
> printf("Und Speicherzugriffsfehler ;-)\n");
>
> int i;
>
> for (i==0; i<1; i++) {
^^
Das ist ein Vergleich und keine Initialisierung. D.h. i hat einen
zufälligen Wert. Deshalb stürzt dein Programm ab, da i mit extrem hoher
Wahrscheinlichkeit als Index auf eine nicht von deinem Programm
allokierte Page zeigt.
Ansonsten "funktionieren" die Programme beide erstmal, da der damit
berechnete Zeiger (==virtuelle Adresse) noch auf eine gültige Adresse
innerhalb deines Heaps zeigt.
Wenn du die Schleife länger laufen lässt "verlässt" du irgendwann den
allozierten Heap Bereich deines Programmes, dann landest du in einer
nicht allozierten Page und generierst damit ein Page Fault.
in /proc/<pid>/maps kannst du die aktuell gültigen virtuellen Bereiche
deines Programmes einsehen.
--
Markus Schulz
Dein Gequassel klingt so, als ob Du ein
U-Boot und eine Marsrakete kreuzen willst, um damit durch tauchen in der
Badewanne zum Mars zu gelangen. [Andreas Kretschmer in d.u.g]
Reply to: