Häufige fehlerursachen in c
Häufige Fehlerursachen in C
Referatsaufbereitung von Michael Thell
Referatsquellen von Thomas Gartner und Michaela Marder
(keine Ahnung von wo die beiden abgeschrieben haben)
Titel
Fehler: 1.Allgemeine 2.Arrays 3.Strings 4.Zeiger 5.Funktionen 6.
Typen
1. Fehler allgemeiner Art
Verwechslung von == und =
Erklärung: == .....
Vergleichsoperator
= ......
Zuweisungsoperator
Beispiel:
int i;
...
if (i = 5) { //i = 5 ist eine Zuweisung, immer TRUE!
...
}
Verwechslung von ' und "
Erklärung: ' ......
Begrenzung eines einzelnen Zeichens
" ......
Begrenzung einer Zeichenkette
Beispiel:
char zeichen, zeichenkette[6];
zeichen = 'z'; // richtig!
zeichen = "z"; // falsch!
strcpy(zeichenkette,"test"); // richtig!
strcpy(zeichenkette,'test'); // falsch!
Verwechslung der Stellung von In/Dekrement-Operatoren
Beispiel: x = ++i; // x erhält den neuen Wert von i
x = i++; // x erhält den alten Wert von i
Kontrollstrukturen
Strichpunkte hinter einer Kontrollanweisung (if, for, while) entsprechen einer Leeranweisung.
Beispiel:
for (int i=0; i<10; i++);
printf("%i",i); // i wird nur einmal ausgegeben
Fehlendes break im switch-Statement
Beispiel:
switch(i) {
case 1: Printf("eins"); break; // Ausgabe: eins
case 2: Printf("zwei"); // Ausgabe: zweidrei
case 3: Printf("drei"); break; // Ausgabe: drei
}
Achtung: In Fällen von trickreichen Algorithmen kann das break auch absichtlich weggelassen werden!2. Fehler bei Arrays
Bereichsüberschreitung
In C beginnen Arrays mit dem Index 0, hingegen bei der Vereinbarung wird die Anzahl der Elemente des Arrays angegeben.
Beispiel:
int feld[100]; // Index von 0 bis 99
for (int i = 1; i<=100; i++) // Der Arraybereich wird überschritten
{
printf("%i",feld[i]);
...
}
Arrays als Parameter
Arrays werden immer als Zeiger auf das erste Element übergeben.
Beispiel:
void test (char name[6])
{
printf("%i",sizeof(name));
}
Beachte: Diese Funktion gibt die Zeigergröße (je nach Speichermodell 2 bzw. 4) und nicht die Arraygröße aus!
3. Fehler bei der Stringbehandlung
Grundsätzlich treten bei der Verwendung von Strings, bedingt durch deren gleiche Implementierung, die selben Fehler wie bei Arrays auf!
nicht abgeschlossene Strings
In C werden Strings als Arrays von einzelnen Zeichen abgespeichert. Das Ende des Strings wird durch eine Abschlußnull (ASCII 0) definiert. Fehlt diese Null wird das Stringende von Stringfunktionen nicht erkannt!
Beispiel:
char t1[5]="test";
char t2[6];
strncpy(t2, t1, 2); // String t2 is nicht durch eine Null abgeschlossen
Printf("%s",t2); // gibt den String und den gesammten Speicherinhalt
// bis zur ersten ASCII 0 aus!
Vergleich bzw.
Zuweisung
Erklärung: == .... Vergleicht Adressen, nicht die Inhalte
= ..
... setzt Adresse um, kopiert nicht die Inhalte
=> Vergleichen von Inhalten mit strcmp
=> Zuweisen von Inhalten mit strcpy
Beispiel:
char name1[5]="test";
char name2[5]="test";
char *name3;
name3 = name1;
if (name1 == name2) {} // => FALSE
if (name1 == name3) {} // => TRUE
if (strcmp(name1, name2) == 0) // => TRUE
Unterschied zwischen Leerstring und NULL
Der Leerstring entspricht einem Character-Array bei dem das 1. Element ASCII 0 ist.
NULL ist eine Konstante, die angibt, daß ein Zeiger den Wert 0 hat.
Beispiel:
char *x1 = NULL; // Zeiger hat den Wert 0
char *x2 = ""; // Zeiger zeigt auf eine Speicherstelle in dem 0 steht
4. Fehler bei Zeigern
nicht initialisierte Zeiger
Zeiger zeigen vor der Initialisierung auf irgendeine Adresse im Speicher, daher müssen sie vor ihrer Verwendung immer initialisiert werden bzw. Speicher muß reserviert werden!
Beispiel:
char feld[10];
char *s1;
char *s2 = feld;
strcpy (s1, "Text"); // falsch
strcpy (s2, "Text"); // richtig
5. Fehler bei Funktionsaufrufen
In C gibt es grundsätzlich keine Var-Parameter. Daher müssen Var-Parameter "künstlich" durch Zeiger erzeugt werden.
Funktionsaufruf stimmt mit der Vereinbarung nicht überein
Beispiel:
int zahl;
scanf(" %d ", zahl); //Falsch! es wird ein Zeiger erwartet!
scanf(" %d ",&zahl); //Richtig!
Der Funktionsaufruf ist richtig, die Bedeutung jedoch falsch
Beispiel:
Falsch:
int *zahl;
scanf("%d", zahl); // Zeiger ist nicht initialisiert!
Richtig:
int zahl, *pzahl;
pzahl = &zahl;
scanf("&d", pzahl);
6.
Fehler bei der Typkonvertierung
Ausdrücke
Werden Variablen underschiedlichen Typs einander zugewiesen, so laufen automatische Konvertiermechanismen ab.
Ergebnistyp ist vom Operandentyp abhängig!
Beispiel:
float f;
int i1, i2;
long l;
...
f=1/5; // f erhält den Wert 0 anstatt 0.2
.
..
l=i1*i2 // Überlauf wenn 32767 überschritten wird
...
Char und Int Konvertierung
Grundsätzlich kann mit Char- wie mit Int-Werten gerechnet werden.
Bei der Ausgabe gibt es jedoch Unterschiede.
Beispiel:
char zeichen;
...
zeichen = 'ä'; // ASCII 132
..
.
printf("%d", zeichen); // Ausgabe: -124
Lösung: zeichen als unsigned char vereinbaren!
Anmerkungen: |
| impressum | datenschutz
© Copyright Artikelpedia.com