Fallo de segmentación que invierte una cadena literal

#include  #include  int main(void) { //char s[6] = {'h','e','l','l','o','\0'}; char *s = "hello"; int i=0,m; char temp; int n = strlen(s); //s[n] = '\0'; while (i<(n/2)) { temp = *(s+i); //uses the null character as the temporary storage. *(s+i) = *(s+ni-1); *(s+ni-1) = temp; i++; } printf("rev string = %s\n",s); system("PAUSE"); return 0; } 

En la comstackción, el error es error de segmentación (violación de acceso). Por favor, diga cuál es la diferencia entre las dos definiciones:

 char s[6] = {'h','e','l','l','o','\0'}; char *s = "hello"; 

Su código intenta modificar un literal de cadena que no está permitido en C o C ++ Si cambia:

 char *s = "hello"; 

a:

 char s[] = "hello"; 

entonces está modificando el contenido de la matriz, en la que se ha copiado el literal (equivalente a inicializar la matriz con caracteres individuales), lo cual está bien.

Si haces char s[6] = {'h','e','l','l','o','\0'}; pones 6 caracteres en una matriz en la stack. Cuando haces char *s = "hello"; solo hay un puntero en la stack y la memoria a la que apunta puede ser de solo lectura. Escribir en esa memoria causa un comportamiento indefinido.

Con algunas versiones de gcc puede permitir la modificación de cadenas estáticas con cadenas de escritura. No es que realmente haya una buena excusa para hacer eso.

Puedes probar esto:

 void strrev(char *in, char *out, int len){ int i; for(i = 0; i < len; i++){ out[len - i - 1] = in[i]; } } 

Tenga en cuenta que no se ocupa del terminador de cadena.