2010-11-20 14 views
8
int main() 
{ 
     char *temp = "Paras"; 

     int i; 
     i=0; 

     temp[3]='F'; 

     for (i =0 ; i < 5 ; i++) 
       printf("%c\n", temp[i]); 

     return 0; 
} 

¿Por qué temp[3]='F'; causará un error de segmentación porque temp no es const?¿Por qué lo siguiente producirá un error de segmentación?

+3

Porque su implementación de C/OS es generosa e inmediatamente termina el programa cuando invoca un comportamiento indefinido en lugar de conjurar fuerzas demoníacas en su nariz. –

Respuesta

9

No tiene permiso para modificar literales de cadena.

+0

Pero 'temp' no es' const' – cse

+0

Sí. Y creo que los compiladores deberían advertirte sobre eso, pero gcc, por ejemplo, no. De cualquier manera, el estándar permite al compilador poner las constantes de cadena en la memoria de solo lectura. –

+0

Entonces ¿por qué 'char temp [6] =" Paras ";' funciona? – cse

0

* temp se define como un puntero a una constante (a veces llamado un literal de cadena, especialmente en otros idiomas).

Por lo tanto, la línea con el error está tratando de cambiar el tercer carácter de esta constante.

Intente definir una matriz de caracteres y usar strcpy para copiar la temperatura en ella. Luego, haga el código anterior en la matriz, debería funcionar. (Lo siento mi iPad aquí no le gusta para insertar código en la interfaz del SO)

+2

Conozco la sensación. Creo que los desarrolladores de SO deberían considerar a los usuarios de iPad para el futuro previsible. –

0

Como se puede ver, temp es un puntero que apunta a una dirección aleatoria, donde la matriz sin nombre con el valor Paras reside. Y esa matriz es una constante de cadena.

Para su programa funcione, es necesario utilizar una matriz en lugar de un puntero:

char temp[6] = "Paras"; 

Ahora bien, si usted se está preguntando por qué es temp[6] en lugar de temp[5], el código anterior inicializa una cadena, y completamente diferente de:

char temp[5] = {'P', 'a', 'r', 'a', 's'}; 

Strings están terminados con un terminador nulo \0. Y la cadena de inicialización será como:

char temp[6] = {'P', 'a', 'r', 'a', 's', '\0'}; 
+4

Mejor aún, 'char temp [] =', por lo que el compilador calcula la longitud. –

0
temp[3]='F'; 

Esta línea no es correct.The "temp" es un valor constante, lo que no puede modificarlo.

Cuestiones relacionadas