Punt. a stringa e segmentation fault

di il
4 risposte

Punt. a stringa e segmentation fault

Ciao a tutti/e,
da qualche settimana sto studiando il C e sono arrivato all'argomento puntatori. Ieri ho provato a svolgere un esercizio in cui inizializzo una stringa (str) tramite un puntatore a char e poi la passo ad una funzione (rovescia) che dovrebbe invertirla....invece il compilatore mi dice che c'è un problema di segmentation fault.

#include <stdio.h>

char *rovescia(char *p);

int main(){
    char *str="ciao";
    char str2[10]="ciaooo";
    printf("%s\n", str);
    //da errore di segmentation fault 
    printf("%s\n", rovescia(str));    
    //funziona
    printf("%s\n", rovescia(str2));      
    getch();
    return 0;
}

char *rovescia(char *p){
    char *p1, *p2, c;   
    p1=p2=p;
    
    //mi sposto fino alla fine della stringa
    while(*p2)  
        p2++;
    p2--;
    
    //inverto i caratteri
    while(p1<p2){
        c=*p2;
        *p2=*p1;    //qui da un errore di segmentation fault
        *p1=c;
        p1++;
        p2--;
    }
        
    return p;
}


Se invece passo una stringa (str2) creata nel modo più "classico" allora il programma funziona. Ho intuito che il problema riguarda il modo in cui è stata creata la stringa che passo alla funzione ma non riesco a capire il motovo preciso, qualcuno può spiegarmelo per favore??
Grazie

4 Risposte

  • Re: Punt. a stringa e segmentation fault

    Succede perché nel primo caso esiste in memoria un puntatore ma la stringa è allocata come costante nel codice e non in memoria. Quindi, quando vai a modificarla (in esecuzione non in compilazione), hai un errore perché la costante non può essere modificata.
    Nel secondo caso, la stringa è allocata in memoria e quindi è modificabile.

    Se utilizzi solamente un puntatore devi allocare lo spazio con una malloc e copiare la stringa con una strcpy
  • Re: Punt. a stringa e segmentation fault

    String literals are allocated in read only(implementation defined) memory regions and an user program should not modify it in anyway. Any attempt to do so results in a Undefined Behavior.

    Traduci la sentenza e hai capito il tuo problema.
  • Re: Punt. a stringa e segmentation fault

    oregon ha scritto:


    Succede perché nel primo caso esiste in memoria un puntatore ma la stringa è allocata come costante nel codice e non in memoria. Quindi, quando vai a modificarla (in esecuzione non in compilazione), hai un errore perché la costante non può essere modificata.
    Nel secondo caso, la stringa è allocata in memoria e quindi è modificabile.
    Non mi è ben chiaro quello che hai scritto: in memoria c'è solo il puntatore str, ed invece le 4 lettere di "ciao" dove sono?? non vengono memorizzate in 4 byte consecutivi a partire dall'indirizzo di str?

    oregon ha scritto:


    Se utilizzi solamente un puntatore devi allocare lo spazio con una malloc e copiare la stringa con una strcpy
    Ho aggiunto queste due istruzioni e funziona, grazie della risposta :
    
    char *str=malloc(10*sizeof(char));
    strcpy(str, "ciao");
    
  • Re: Punt. a stringa e segmentation fault

    Ci sono diverse aree in cui sono memorizzati i dati.

    Esiste un'area di "dati costanti" in cui i dati sono memorizzati e non sono modificabili, come la stringa "ciao" del primo caso.

    Altre aree, stack ed heap, in cui i dati possono essere letti/scritti. E' il secondo caso o il caso della malloc.
Devi accedere o registrarti per scrivere nel forum
4 risposte