Über das Ende hinaus
Was passiert, wenn du einen Index verwendest, zu dem es kein Element gibt, etwa den Index 5 in einem Array mit fünf Elementen? Das hängt davon ab, ob der Index eine Zahl ist, die im Code steht, oder eine Variable.
Wenn der Index eine Zahl ist, erkennt der Compiler den Fehler, und das Programm lässt sich nicht kompilieren:
#include <stdio.h>
int main(void) {
int punkte[5] = {80, 92, 75, 60, 88};
printf("%d\n", punkte[5]);
return 0;
}main.c:5:20: error: array index 5 is past the end of the array (that has type 'int[5]') [-Werror,-Warray-bounds]
5 | printf("%d\n", punkte[5]);
| ^ ~
main.c:4:5: note: array 'punkte' declared here
4 | int punkte[5] = {80, 92, 75, 60, 88};
| ^
1 error generated.Die Meldung sagt, dass der Index 5 hinter dem Ende des Arrays liegt, dessen Typ int[5] ist: ein Array aus fünf int. Die Zeilen darunter, die mit note: beginnen, zeigen, wo das Array erstellt wurde. Auch ein negativer Index ist ein Fehler: Für punkte[-1] sagt die Meldung, dass der Index -1 vor dem Anfang des Arrays liegt.
Wenn der Index eine Variable ist, prüft der Compiler ihn nicht, denn die Variable bekommt ihre Werte erst, während das Programm läuft. So sieht es aus, wenn eine Schleife einen Schritt zu weit geht, mit <= statt <:
#include <stdio.h>
int main(void) {
int punkte[5] = {80, 92, 75, 60, 88};
for (int i = 0; i <= 5; i++) {
printf("%d\n", punkte[i]);
}
printf("Fertig\n");
return 0;
}80
92
75
60
88
RuntimeError: unreachableDas Programm gibt alle fünf Elemente aus. Im sechsten Durchlauf der Schleife ist i gleich 5, und bei punkte[5] bricht das Programm mit dem roten Fehler RuntimeError: unreachable ab. Fertig wird nie ausgegeben. Die Meldung sagt nicht, was schiefgelaufen ist, aber in dieser Lektion bedeutet sie einen Index außerhalb eines Arrays. Die letzte Zeile, die ausgegeben wurde, zeigt dir, wie weit das Programm gekommen ist.
Dasselbe passiert, wenn die Anzahl in einer Schleife größer ist als das Array, zum Beispiel const int ANZAHL = 6; für ein Array mit fünf Elementen.
Warum ist das so wichtig? C selbst prüft Indizes überhaupt nicht. Ein normales C-Programm auf deinem Computer würde lesen, was auch immer im Speicher hinter dem Array liegt, vielleicht eine andere Variable, und mit einem falschen Wert weitermachen. Ein Schreibzugriff auf punkte[5] könnte sogar eine andere Variable überschreiben. Ein solches Programm kann scheinbar funktionieren und trotzdem falsche Ergebnisse liefern, und der Fehler ist sehr schwer zu finden. Hier bricht das Programm bei einem solchen Index ab, damit du den Fehler sofort siehst. Der beste Schutz ist aber, deine Indizes richtig zu setzen: Das erste Element hat den Index 0, das letzte die Größe − 1, und eine Schleife über ein Array hat i < ANZAHL in ihrer Bedingung.
So schreibst du es:
Anweisungen
- 1
Das Programm soll die Zeiten von vier Runden ausgeben. Führe es aus: Es gibt drei Runden aus und bricht mit
RuntimeError: unreachableab. Im letzten Durchlauf der Schleife istigleich4, undrunden[4]liegt hinter dem Ende des Arrays. Korrigiere die Bedingung der Schleife, sodass die Schleife endet, bevoriden Wert4erreicht. Das Programm gibt dann am EndeFertigaus. - 2
Jetzt kommt das Programm bis zum Ende, aber die erste Runde fehlt:
Runde 1zeigt58, die Zeit der zweiten Runde. Lass die Schleife beim Index0beginnen und gib die Nummer der Runde alsi + 1aus. Die Ausgabe lautet dann:Runde 1: 62 s Runde 2: 58 s Runde 3: 60 s Runde 4: 57 s Fertig