Pourquoi l’erreur de segmentation (core dumped) s’applique-t-elle à mon programme C?

Je continue à avoir cette erreur et je ne sais pas comment cela s’applique à mon programme. Ceci est mon programme.

#include #include int nextword(char *str); void main(void) { char *str = "Hello! Today is a beautiful day!!\t\n"; int i = nextword(str); while(i != -1) { printf("%s\n",&(str[i])); i = nextword(NULL); } } int nextword(char *str) { // create two static variables - these stay around across calls static char *s; static int nextindex; int thisindex; // reset the static variables if (str != NULL) { s = str; thisindex = 0; // TODO: advance this index past any leading spaces while (s[thisindex]=='\n' || s[thisindex]=='\t' || s[thisindex]==' ' ) thisindex++; } else { // set the return value to be the nextindex thisindex = nextindex; } // if we aren't done with the ssortingng... if (thisindex != -1) { nextindex = thisindex; // TODO: two things // 1: place a '\0' after the current word // 2: advance nextindex to the beginning // of the next word while (s[nextindex] != ' ' || s[nextindex] != '\n' || s[nextindex] != '\t') { if ( s[nextindex] == '\0') return -1; else { nextindex++; if (s[nextindex]==' '||s[nextindex]=='\n'||s[nextindex]=='\t') str[nextindex]='\0'; } } } return thisindex; } 

Mon programme est censé avoir une sortie sur la console de

 Hello! Today is a beautiful day!! 

Vous essayez de changer un littéral Ssortingng . Cela entraîne un comportement indéfini, tel qu’un segfault.

 str[nextindex]='\0' 

et dans Here, str est le paramètre de nextWord() , qui est:

 char *str = "Hello! Today is a beautiful day!!\t\n"; int i = nextword(str); 

Depuis "Hello! Today is a beautiful day!!\t\n" est un littéral de chaîne – le changer est un comportement indéfini, et dans votre cas (heureusement) cela a causé une erreur de segmentation.

Vous devez comstackr avec tous les avertissements et informations de débogage activés (si vous utilisez GCC, par exemple sous Linux, cela signifie que la compilation avec gcc -Wall -g ).

Ensuite, vous devriez apprendre à utiliser le débogueur (par exemple, gdb sous Linux) et éventuellement un détecteur de fuite comme Valgrind.

une erreur de segmentation peut se produire si vous déréférenciez un pointeur “incorrect”, par exemple un pointeur NULL ou un point non initialisé. Cela peut également arriver si vous écrivez dans un segment en lecture seule (vous écrasez probablement un littéral de chaîne placé dans un segment en lecture seule appelé segment .text ou .rodata ).

Tenir compte de tous les avertissements du compilateur (et les activer) et utiliser un débogueur sont des compétences essentielles de tout programmeur C.

S’il vous plaît donner nextindex une valeur initiale