Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/forschleife/Musterlösung: Unterschied zwischen den Versionen

K (Kategorie)
 
(3 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
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). Das bedeutet, dass die schleife a[0] bis a[32] mit 0 beschreibt. Da i auf dem Stack for dem Array liegt, wird nun der Wert von i mit 0 ebenfalls überschrieben und die Abbruchbedingung der for-Schleife trifft nicht ein.
+
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.
 
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: Veranstaltungen der Freitagsrunde]]
 
 
[[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.