8.6. Stolpersteine
- Die wohl größte Gefahr bei der Verwendung von Arrays besteht in der Überschreitung der Array-Grenzen und damit in der Zerstörung von fremden Speicherinhalten. Die konsequente Verwendung von symbolischen Konstanten in Array-Definitionen kann einen Beitrag zur Vermeidung der sogenannten "off-by-one"-Fehler leisten.
- Elemente in zweidimesionalen Arrays können nicht als array[x, y], sondern müssen als array[x][y] angesprochen werden.
- Falsche Initialisierung von zweidimensionalen Arrays: Der erste Index bestimmt nicht die Anzahl der Spalten, sondern der Zeilen!
- Die Gefahr schlechthin bei der Verwendung von Pointern besteht darin, nicht initialisierte, also "wilde" Pointer dereferenzieren zu wollen. Dies hat zur Folge, daß beim Lesen aus den betroffenen Speicherbereichen mit unsinnigen Werten zu rechnen ist, während das Schreiben von Daten an beliebige Adressen allgemein zum Absturz des Programms führt.
- Soll einem Pointer die Adresse einer Variablen zugewiesen werden, dann muß der betroffenen Variablen der Adreßoperator vorangestellt werden. Dies gilt aber nicht, wenn auf der rechten Seite der Zuweisung ebenfalls ein Pointer oder der Name eines Arrays steht!
- Arithmetik darf nur auf solche Pointer angewendet werden, die auf ein Array oder auf einen durch malloc() reservierten Speicherbereich zeigen. Andernfalls verwandelt sich der Pointer flugs in einen wilden Pointer!
- Pointer-Arithmetik birgt die gleiche Gefahr wie die Verwendung von Arrays: die Zuweisung von Daten an Adressen außerhalb gültiger Speicherbereiche durch sogenannte "off-by-one"-Fehler. Diese entstehen, sobald die Abbruchbedingung in Schleifen ungenau gesetzt wurde und daher die Änderung des Pointer-Wertes einmal zuviel vollzogen wird.
- Obwohl es sich bei Array-Namen um Pointer auf den Beginn von Arrays handelt, können Arrays nicht durch arithmetische Operationen oder Zuweisungen modifiziert werden!
- Mit free() darf nur solcher Speicher freigegeben werden, der zuvor mit malloc(), calloc() oder realloc() angefordert wurde. Außerdem müssen Sie darauf achten, daß Sie keine Speicherbereiche freigeben, die bereits mit free() ans System zurückgegeben wurden.