wertebereichüberschreitung im vektor
-
hi, ich wollte mal fragen was genau passiert, wenn ich in nem vektor mit dem index den wertebereich überschreite...
z.b.:
int x; int arr[10]; x = arr[11];
fehlermeldung wird ja nich ausgegeben....
liest der dann einfach die sizeof(int) bytes die im speicher folgen?gruß wolb
-
Bist du sicher, das keine Fehlermeldung kommt?
-
jop
-
tja....dann nennt man das wohl
"undefinertes Verhalten" ( wobei, wer hat schon ein definiertes Verhalten? (RL) )
und du schreibst unkontrolliert im speicher rum, würd ich nicht machen,
ist böse! ( welcher kompiler lässt das denn zu?)
-
Buena Vista schrieb:
tja....dann nennt man das wohl
"undefinertes Verhalten" ( wobei, wer hat schon ein definiertes Verhalten? (RL) )
und du schreibst unkontrolliert im speicher rum, würd ich nicht machen,
ist böse! ( welcher kompiler lässt das denn zu?)
Eigentlich liest er aus dem Speicher. Desweiteren wird den Code wohl JEDER C-Compiler ohne Fehler oder Warnung kompilieren (wenn, dann gibt es vllt nen Warning weil das Array nicht initialisiert wurde).
-
interpreter schrieb:
Buena Vista schrieb:
tja....dann nennt man das wohl
"undefinertes Verhalten" ( wobei, wer hat schon ein definiertes Verhalten? (RL) )
und du schreibst unkontrolliert im speicher rum, würd ich nicht machen,
ist böse! ( welcher kompiler lässt das denn zu?)
Eigentlich liest er aus dem Speicher. Desweiteren wird den Code wohl JEDER C-Compiler ohne Fehler oder Warnung kompilieren (wenn, dann gibt es vllt nen Warning weil das Array nicht initialisiert wurde).
Ahso richtig er liest...hm war schon spät...lesen..tja
-
Das Betriebssystem kann aber an dieser Stelle mekern, wenn es will.
Also ich weiss das Windows solche Programmierfehler gerne mit einem Fehlerbericht abmahnt und Linux sich mal soll und so verhält.
Es ist aber nicht so ratsamm im Speicher rum zu schreiben, nicht weil man irgendwie Im Kernel-Speicher iorgendwas ändert sondern sich gegebenfalls seine Laufende Programme zum abstrutz bringen kann.
-
wolb10 schrieb:
hi, ich wollte mal fragen was genau passiert, wenn ich in nem vektor mit dem index den wertebereich überschreite...
z.b.:
int x; int arr[10]; x = arr[11];
fehlermeldung wird ja nich ausgegeben....
liest der dann einfach die sizeof(int) bytes die im speicher folgen?bereits arr[10] gehört schon nicht mehr dazu. das array geht von arr[0]...arr[9]. und...auch wenn's nur'n lesezugriff ist, kann's schon abstürzen
-
int x; int arr[10]; x = arr[11];
Grundsätzlich stürzt das Programm nur hierbei dann ab, wenn auf Speicheradresssen außerhalb des zugewiesenen Speicherbereichs zugegriffen wird (ist jedenfalls bei Unix/Linux so, es gibt dann einen sogenannten Segmentation-Fehler; sollte prinzipiell bei anderen Betriebssystemen aber auch so sein).
Sind hinter der Variablen arr[] noch weitere Variablen definiert (mit mindestens der Größe 2*sizeof(int)), so wird das Programm nicht abstürzen.
Anderenfalls kommt es darauf an, wo die Variablendeklaration stattfindet.
(1) Variablendeklaration außerhalb der Funktionen oder mit Geltungsbereich "static":
Array wird im bss-Segment angelegt. Je nach Speicherverwaltung (MMU) wird der maximale Speicherbereich blockweise oder segmentweise limitiert. Bei segmentweiser Verwaltung ist ein Absturz wahrscheinlich (da die Adresse außerhalb des zugewiesenen Bereichs liegt. Bei blockweiser Speicherzuweisung ist ein Absturz nur dann gegeben, wenn das Array genau mit dem Ende eines Speicher-Blockes abschließt. Folglich also eher unwahrscheinlich.(2) Variablendeklaration innerhalb einer Funktion:
Array wird im Stack-Segment angelegt. Hier ist ein Absturz eher unwahrscheinlich, da das Stack-Segment von der größten Unterprogrammtiefe abhängt und automatisch bei neuen Funktions-Calls zur Laufzeit angepasst wird.