C-Kurs/forschleife/Musterlösung: Unterschied zwischen den Versionen
Mutax (Diskussion | Beiträge) (Absatz von der anderen Version reinkopiert....) |
PaulG (Diskussion | Beiträge) K (verschob „Ckurs/forschleife/Musterlösung“ nach „C-Kurs/forschleife/Musterlösung“) |
||
(2 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
Das Programm terminiert nicht. | Das Programm terminiert nicht. | ||
− | Die for-Schleife läuft von 0 bis index sizeof(a). sizeof(a) ist aber nicht 8, sondern 32 (sizeof(int) * 8). | + | Die for-Schleife läuft von 0 bis index sizeof(a). sizeof(a) ist aber nicht 7(oder 8), sondern 32 (sizeof(int) * 8). |
Das bedeutet, dass die schleife a[0] bis a[32] mit 0 beschreibt. | Das bedeutet, dass die schleife a[0] bis a[32] mit 0 beschreibt. | ||
− | Da i auf dem Stack | + | Da i auf dem Stack vor dem Array liegt, wird nun der Wert von i mit 0 ebenfalls überschrieben und die Abbruchbedingung der for-Schleife trifft nicht ein. |
+ | |||
+ | Anders ausgerückt: Die for-schleife im Programm überschreitet beim Schreiben auf das Array a die Array-grenze. Es wird damit die Speicherstelle nach dem Array überschrieben. Bei einigen Rechnerarchitekturen befindet sich dort die Zählervariable i, die daraufhin wieder auf 0 gesetzt wird. | ||
− | |||
Normalerweise würde <= 8 reichen, allerdings passt das durch den Aufbau des Stacks nicht ganz, weswegen wir uns fuer einen größeren Wert (in dem Fall sizeof(int) für mehr Verwirrung) entschieden haben. 9 sollte auch gehen. | Normalerweise würde <= 8 reichen, allerdings passt das durch den Aufbau des Stacks nicht ganz, weswegen wir uns fuer einen größeren Wert (in dem Fall sizeof(int) für mehr Verwirrung) entschieden haben. 9 sollte auch gehen. | ||
+ | |||
Um diesen Fehler zu beheben sollte die for-Schleife for(i=0; i<sizeof(a)/sizeof(int); i++) lauten. | Um diesen Fehler zu beheben sollte die for-Schleife for(i=0; i<sizeof(a)/sizeof(int); i++) lauten. | ||
− | |||
[[Kategorie: CKurs Aufgaben]] | [[Kategorie: CKurs Aufgaben]] |
Aktuelle Version vom 5. März 2013, 17:37 Uhr
Das Programm terminiert nicht.
Die for-Schleife läuft von 0 bis index sizeof(a). sizeof(a) ist aber nicht 7(oder 8), sondern 32 (sizeof(int) * 8).
Das bedeutet, dass die schleife a[0] bis a[32] mit 0 beschreibt.
Da i auf dem Stack vor dem Array liegt, wird nun der Wert von i mit 0 ebenfalls überschrieben und die Abbruchbedingung der for-Schleife trifft nicht ein.
Anders ausgerückt: Die for-schleife im Programm überschreitet beim Schreiben auf das Array a die Array-grenze. Es wird damit die Speicherstelle nach dem Array überschrieben. Bei einigen Rechnerarchitekturen befindet sich dort die Zählervariable i, die daraufhin wieder auf 0 gesetzt wird.
Normalerweise würde <= 8 reichen, allerdings passt das durch den Aufbau des Stacks nicht ganz, weswegen wir uns fuer einen größeren Wert (in dem Fall sizeof(int) für mehr Verwirrung) entschieden haben. 9 sollte auch gehen.
Um diesen Fehler zu beheben sollte die for-Schleife for(i=0; i<sizeof(a)/sizeof(int); i++) lauten.