Dynamisches struktur Array anlegen
-
Hallo,
ich habe eine kleines Verständnisproblem und hoffe das mir jemand von euch weiterhelfen kann
.
Folgender Ausgangscode:
#include <stdio.h> #include <stdlib.h> /* the definition of the variables of a structure, but no space allocated for it */ struct EmLine { float a; int ip; } ; /* this says that Level2 is a pointer to variables of this structure */ struct EmLine *Level2 ; int main(void) { /* this will make Level2 and array with 10 structs */ Level2 = malloc( 10*sizeof( struct EmLine ) ); if( Level2 == NULL ) { printf(" alloc error\n" ); } Level2[1].a = 0.; Level2[40].ip = 767; printf("%d", Level2[40].ip); free(Level2); }
Soweit ich weiß werden mithilfe von malloc() 10 strukturen von der Größe sizeof(struct EmLine ) angelegt. Soweit so gut. Nur weshalb ist es mir anscheinend möglich Level2[40].ip die 767 zuzuweisen und anschließend auszugeben? Ich dachte es stehen überhaupt nur 10 struct array's zur Verfügung?
Gruß
Flo
-
-
Ähmm, was soll das jetzt bedeuten
-
Das soll bedeuten das ich´s selber nicht peil.....
hätte jetzt auch gedacht, das da nur 10 * sizeof(struct...) angelegt werden!
Warum meckert hier der compiler nicht
-
Eventuell greife ich auf unverfizierten Speicherplatz zurück, da Pointer Level2, und überschreibe diesen dann - was äußerst schlecht wäre
Interessant wäre dann aber, dass das so einfach geht. Schließlich wird alles noch unklarer wenn ich auf das struct array über eine laufvariable zugreife. Wenn das aber der Fall ist, würde ich gerne wissen wie ich diesen unerlaubten Speicherzugriff verhindern kann?
Gruß
Flo
-
Florian M. schrieb:
Eventuell greife ich auf unverfizierten Speicherplatz zurück, da Pointer Level2, und überschreibe diesen dann - was äußerst schlecht wäre
Du schreibst schlicht auf nicht reservierten Speicher.
Florian M. schrieb:
Interessant wäre dann aber, dass das so einfach geht. Schließlich wird alles noch unklarer wenn ich auf das struct array über eine laufvariable zugreife.
Dass es noch geht ist reines Glück. Aber was wird da unklarer? Das Verhalten ist doch dasselbe wenn du Speicher nicht über malloc() reservierst? Du schreibst in's Nirvana und irgendwann crasht's...
Wenn das aber der Fall ist, würde ich gerne wissen wie ich diesen unerlaubten Speicherzugriff verhindern kann?
Einfach nicht in den Bereich schreiben? Du weisst als Programmierer ja, wie groß der Bereich ist.
Edit: Rächtsschraipkorekkktur
Edit2: Quotekorrektur. Diesmal mit Vorschau
-
Es ist vollkommen legal das zu machen.
Das verhalten ist lediglich undefiniert.In C gibt es niemanden der dich bei der Hand nimmt und aufpasst, dass du keine Fehler machst. Da muss man selber auf alles achten.
Dass der Code nicht abstürtzt ist zufall, mehr nicht. Schreib halt mal an die Stelle 500 - vielleicht passiert dann etwas, vielleicht auch nicht. Je nachdem wem der Speicher gehört, in den du gerade schreibst. Vielleicht gehört er dir, vielleicht auch nicht. Und wenn er dir gehört, dann überschreibst du damit vielleicht wichtige Werte, vielleicht aber auch nicht.
Zusammengefasst: es kann alles passieren, auch garnichts.
-
Das habe ich doch geschrieben. Zitat: " Eventuell greife ich auf unverifizierten Speicherplatz zurück - was äußerst schlecht wäre"
Das Pointer in C und auch C++ eine Gafahrenquelle sind, weiß ich auch. Auch weiß ich das es bei "wahllosen" Speicherzugriff Zufall ist, das mir das Programm nicht abstürzt.
Eine einfache Bestätigung das ich auf ungültigen und unreservierten Speicherplatz zugreife hätte genügt.
Trotzdem Danke für die ausführlichen Erläuterungen
.
Gruß
Flo