Seg fault su stringa

di il
6 risposte

Seg fault su stringa

Mi spiegate perchè mi dà seg fault sulla riga segnata? La funzione elimina gli spazi vuoti a destra di una stringa.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* spazi_finali(char* str){
	char* reverse = str+strlen(str)-1;
	
	while ( (*reverse == ' ') && (reverse >= str))
		reverse--; 
	*(reverse++) = '\0'; // SEG FAULT
		
	return(str); 
}	

int main(){

	char* s = "asd ";
	spazi_finali(s);
	
	printf("%d\n", strlen(s));
	
	return 0;
}

6 Risposte

  • Re: Seg fault su stringa

    Ciao Joker91,

    stai cercando di modificare una zona di memoria che non puoi toccare, la stringa "asd " è una costante allocata sullo stack. Alloca la stringa nello heap con la malloc o con la new e vedrai che tutto funziona.
  • Re: Seg fault su stringa

    @barba
    Non voglio criticare la tua risposta, solo che è inesatto dire che la costante risiede nello stack... il puntatore si, ma la costante è allocata in una sezione apposita denominata rodata (read-only-data) del segmento dati (ds) oppure posizionata segmento del codice (cs)...dipende dal sistema.

    Si può provare a vedere gli indirizzi con uno stupido programmino:
    
    #include <stdio.h>
    
    int global;
    int main ()
    {
        int local;
        printf ("main()=%p\n",&main);
        printf ("rodata=%p\n",&"Hello World");
        printf ("global=%p\n",&global);
        printf ("local =%p\n",&local);
    
        return 0;
    }
    
    
    oppure generare l'assembler con il compilatore:
    
    max@studio:~/forum> gcc -S prova.c
    max@studio:~/forum> grep -2 "asd" prova.s
            .section        .rodata
    .LC0:
            .string "asd "
    .LC1:
            .string "%d\n"
            .text
    max@studio:~/forum> 
    
    Ciao
  • Re: Seg fault su stringa

    ixamit ha scritto:


    Non voglio criticare la tua risposta, solo che è inesatto dire che ...
    He, he, qui nessuno si offende se un altro da una risposta migliore , anzi quando la risposta è così precisa, approfondita ed esauriente si rimane pure ammirati!
  • Re: Seg fault su stringa

    Riassumendo:
    1)usare strcpy per copiare la stringa perché altrimenti si va a lavorare in un'area dedicata alle costanti;
    2)usare l'operatore prefisso e non quello postfisso per l'incremento del puntatore *(++reverse) altrimenti si accorcia la stringa di un carattere oltre a togliere gli spazi bianchi.
  • Re: Seg fault su stringa

    Grazie delle risposte, ma non ho capito questa cosa dell'operatore... Non hanno significato equivalente?

    già che ci sono faccio un'altra domanda:

    allocando dinamicamente la stringa s... in che modo posso scriverci su? Oltre al metodo diretto usando l'indice e assegnando carattere per carattere... C'è un modo più veloce?

    edit: e se invece avessi un array allocato staticamente? Come posso fare una funzione che lo modifichi?
  • Re: Seg fault su stringa

    grazie delle risposte,

    1)ma non ho capito questa cosa dell'operatore... Non hanno significato equivalente?

    2)allocando dinamicamente la stringa s... in che modo posso scriverci su? Oltre al metodo diretto usando l'indice e assegnando carattere per carattere... C'è un modo più veloce?

    3)edit: e se invece avessi un array allocato staticamente? Come posso fare una funzione che lo modifichi?
    risposte:
    1)
    la differenza tra operatore prefisso e postfisso è che il primo viene eseguito prima dell'uso della variabile al quale è applicato, mentre il secondo viene applicato dopo l'uso della variabile:
    i=3;
    j=i++; // qui j vale 3!
    ....    // nell'istruzione successiva i vale 4 e j vale 3.
    mentre
    i=3;
    j=++i; // qui j vale 4!
    
    2) strcpy è la risposta

    3) se ne vuoi di già fatte guarda dentro string.h. Altrimenti, tratti la stringa come un comune vettore e fai quello che vuoi.
    Spero di esserti stato d'aiuto. Ciao.
Devi accedere o registrarti per scrivere nel forum
6 risposte