Am Donnerstag 14 Februar 2008 schrieb Markus Schulz: > 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. Hallo! Das ist natürlich auch von daher interessant, als ich immer davon ausging, dass die Deklaration der Variable aka "int i;" bereits den Speicherbereich für diese alloziert. Nun, wieder was dazugelernt. Ciao, -- Martin 'Helios' Steigerwald - http://www.Lichtvoll.de GPG: 03B0 0D6C 0040 0710 4AFA B82F 991B EAAC A599 84C7
Attachment:
signature.asc
Description: This is a digitally signed message part.