¿Por qué este código produce una falla de segmentación?

En la línea 18, tengo un fallo de seg en la primera iteración (i = 0).

#include  int main(void) { char* str = "mono"; int length = 0; int i; for (i = 0; ; i++) { if (str[i] == '\0') { break; } else { length++; } } for (i = 0; i < length / 2; i++) { char temp = str[length - i - 1]; str[length - i - 1] = str[i]; // line 18 str[i] = temp; } printf("%s", str); return 0; } 

Escribí este algoritmo para revertir una cadena.

Estás modificando una cadena literal:

 char* str = "mono"; 

y los literales de cadena no son modificables en C.

Para solucionar su problema, use una matriz inicializada por el literal de cadena:

 char str[] = "mono"; 

Error de tiempo de ejecución:

 char* str = "mono"; // str points to an address in the code-section, which is a Read-Only section str[1] = 'x'; // Illegal memory access violation 

Error de comstackción:

 const char* str = "mono"; // This is a correct declaration, which will prevent the runtime error above str[1] = 'x'; // The compiler will not allow this 

Todo bien:

 char str[] = "mono"; // str points to an address in the stack or the data-section, which are both Read-Write sections str[1] = 'x'; // Works OK 

Notas:

  1. En todos los casos, una cadena “mono” se coloca en la sección de código del progtwig.

  2. En el último ejemplo, el contenido de esa cadena se copia en la matriz str .

  3. En el último ejemplo, la matriz str se ubica en la stack si str es una variable local no estática, y en la sección de datos del progtwig, de lo contrario.