¿Por qué se aplica un error de segmentación (núcleo volcado) a mi progtwig C?

Sigo recibiendo este error y no estoy seguro de cómo se aplica a mi progtwig. Este es mi progtwig.

#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 string... 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; } 

Mi progtwig se supone que tiene una salida a la consola de

 Hello! Today is a beautiful day!! 

Estás intentando cambiar un literal de cadena . Esto resulta en un comportamiento indefinido, como un segfault.

 str[nextindex]='\0' 

y en Aquí, str es el parámetro de nextWord() , que es:

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

Ya que "Hello! Today is a beautiful day!!\t\n" es un literal de cadena – cambiarlo es un comportamiento indefinido, y en su caso (afortunadamente) causó una falla de seguridad.

Debe comstackr con todas las advertencias y la información de depuración habilitada (si utiliza GCC, por ejemplo, en Linux, eso significa comstackr con gcc -Wall -g ).

Entonces deberías aprender a usar el depurador (es decir, gdb en Linux) y posiblemente un detector de fugas como valgrind

puede ocurrir una falla de segmentación si no hace referencia a algún puntero “malo”, por ejemplo, uno NULL o uno no inicializado. También puede suceder si escribe en un segmento de solo lectura (probablemente está sobrescribiendo un literal de cadena que se coloca en un solo lectura, también llamado .text o .rodata – segmento)

Tener en cuenta todas las advertencias del comstackdor (y habilitarlas) y usar un depurador son habilidades esenciales de cualquier progtwigdor de C.

Por favor, dale a nextindex un valor inicial