2011-12-09 5 views
5
void main() { 
    void strrev(char *); 
    char *p="GOOd"; 
    strrev(p); 
    printf("%s",p); 
} 

void strrev(char *str) { 
    char temp, *end_ptr; 
    if(str == NULL || !(*str)) return; 
    end_ptr = str + strlen(str) - 1; 

    while(end_ptr > str) 
    { 
     temp = *str; 
     *str = *end_ptr; 
     *end_ptr = temp; str++; 
     end_ptr--; 
    } 
} 

estoy recibiendo la segmentación de error no puede cualquiera que me ayude encontrar la manera de solucionar el problema ...conseguir "la segmentación falló" error en la implementación de la función strrev

Respuesta

5

Un problema es que en el siguiente:

char *p = "GOOd"; 

se permite colocar la cadena literal en la memoria de sólo lectura del compilador.

Cualquier intento de modificar la cadena apuntada por p da como resultado un comportamiento indefinido.

trate de cambiar la línea anterior a:

char p[] = "GOOd"; 

no veo nada de malo en la función strrev() sí.

+0

por lo que el intercambio directo en la cadena no es posible? – sarsarahman

+0

@ S.A.Rahman: Lo es, siempre que utilice una forma adecuada de asignar la memoria para la cadena (por ejemplo, 'char p [] =" GOOd "' o 'malloc' /' strdup'). – NPE

8

La declaración:

char *p = "GOOd"; 

Define una cadena literal "BUENA", apuntada por un puntero p.

Está intentando modificar este literal de cadena mediante la función strrev que da como resultado Comportamiento no definido (UB) y el bloqueo.

El problema con los literales de cadena es que se almacenan en una ubicación de memoria de solo lectura (Implementación definida) y los programas de usuario no pueden cambiar eso. Si un programa intenta hacerlo, causa un UB.

Por lo tanto, en lugar de utilizar un literal de cadena, debe utilizar una matriz.

Debería utilizar:

char p[] = "GOOd"; 
+0

gracias, pero ... ¿qué debería aprender de este error ... e incluso de cuántas otras situaciones podrían caer estos tipos de errores (UB)? – sarsarahman

+0

@SARahman: Hay muchos escenarios que dan como resultado UB.El estándar C los menciona claramente como tales, pero la Experiencia IMHO es la forma de hacerlo, Intentas cosas, te quedas atascado, tratas de encontrar errores, haces preguntas aquí si no puedes obtener ayuda. Cometes errores, aprendes de ellos, con práctica sabrás cuáles son los escenarios comunes que causan UB. –

+0

si la cadena se define como char * p = "GOOd"; ¿cómo funciona la biblioteca estándar? – sarsarahman

Cuestiones relacionadas