Error de segmentación al invertir un literal de cadena [duplicate]

2 minutos de lectura

avatar de usuario
Surya

#include <stdio.h>
#include <stdlib.h>

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+n-i-1);
         *(s+n-i-1) = temp;
         i++;
    }
    printf("rev string = %s\n",s);
    system("PAUSE");
    return 0;
}

En la compilación, el error es un error de segmentación (infracción de acceso). Indique cuál es la diferencia entre las dos definiciones:

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

  • tal vez un titulo diferente? aunque el ejemplo es un código para invertir una cadena, la pregunta real es sobre la modificación de matrices y literales de cadena

    – akf

    3 de julio de 2010 a las 16:54

  • ¿Tiene alguna razón por la que no está usando strrev()? Además, esto se interrumpirá con caracteres de varios bytes.

    – Piskvor salió del edificio.

    3 de julio de 2010 a las 17:19

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

char *s = "hello"; 

para:

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 lo haces char s[6] = {'h','e','l','l','o','\0'}; pones 6 chars en una matriz en la pila. Cuando tu lo hagas char *s = "hello"; solo hay un puntero en la pila y la memoria a la que apunta puede ser de solo lectura. Escribir en esa memoria provoca un comportamiento indefinido.

Con algunas versiones de gcc puede permitir la modificación de cadenas estáticas con -fwritable-strings. No es que haya realmente 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 trata con el terminador de cadena.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad