2016-08-13 10 views
0

Kürzlich habe ich gelernt, C aus K & R's Buch, und dann stieß ich auf einen Fehler. Von dem, was ich weiß, hat ein Segmentierungsfehler etwas mit der Erinnerung zu tun, aber es wird in dem Buch nicht erklärt. Wenn Sie sich bitte meinen Code anschauen und erklären könnten, was ein Segmentierungsfehler ist und wie dieser Fehler in meinem Code aufgetreten ist. Vielen Dank.C lang: Segmentierungsfehler 11

#include <stdio.h> 

#define MAXLINE 256 

int main() { 
    int c, ndigit[10], i, d, e; 
    char str[MAXLINE]; 
    while ((c = getchar()) != EOF) { 
     if (c >= '0' && c <= '9') 
      ++ndigit[c - '0'];} 
    for (i = 0; i <= 9; i++) { 
     for (d = 0; d < ndigit[i]; d++) 
      str[d] = '*'; 
    str[d] = '\0'; 
    printf("%d: %s\n",i,str); 
    for (e = 0; e <= MAXLINE; e++) 
     str[e] = '\0'; 
    } 
    return 0; 
} 
+2

'für (e = 0; e <= MAXLINE; e ++)' sollte 'sein für (e = 0; e

Antwort

4

Sie sind nicht ndigit auf Null initialisiert wird, dann ist es eine Reihe von Müll Werte, die Sie dann erhöhen. Es ist wahrscheinlich, dass die Werte ndigit ziemlich groß sind, was dazu führt, dass Sie mit einem sehr großen Index auf str zugreifen und die Grenzen des Arrays str in ungültige Speicherbereiche überlaufen. Das Betriebssystem versucht, auf ungültige Speicherbereiche zuzugreifen und gibt eine segmentation fault aus, wodurch Ihr Programm zerstört wird.

Auch, wie Jean-François Fabre weist darauf hin, sollte Ihr for -loop zu < MAXLINE gehen, weil der letzte gültige Index für strMAXLINE - 1 ist.

Und wie mszymborski darauf hinweist, möchten Sie wahrscheinlich eine neue Zeile ('\n') am Ende Ihrer Druckanweisung.

+2

Und eine Newline beim Drucken wäre auch nett. – mszymborski

+0

Danke @Cornstalks. Das war so dumm von mir, ich habe heute Morgen meinen Kaffee nicht getrunken. Das Programm läuft jetzt wie erwartet –

+1

Es lohnt sich, hinzuzufügen, dass 'Valgrind' zum Debuggen von Problemen sehr gut funktioniert. Ich glaube, es fängt Speicherzugriffsanweisungen ab und ist in der Lage, das Problem mit einer tödlichen Genauigkeit zu lokalisieren. – mszymborski

Verwandte Themen