2011-12-09 5 views

risposta

5

Un problema è che il seguente:

char *p = "GOOd"; 

il compilatore è permesso di collocare la stringa letterale in memoria di sola lettura.

Qualsiasi tentativo di modificare la stringa indicata da p ha come risultato un comportamento non definito.

provare a cambiare la linea di cui sopra a:

char p[] = "GOOd"; 

non vedo niente di sbagliato con la funzione strrev() stesso.

+0

non è possibile lo scambio diretto nella stringa? – sarsarahman

+0

@ S.A.Rahman: È, a condizione che si utilizzi un modo adatto per allocare la memoria per la stringa (ad esempio 'char p [] =" GOOd "' o 'malloc' /' strdup'). – NPE

8

La dichiarazione:

char *p = "GOOd"; 

Definisce una stringa letterale "GOOD", puntata da un puntatore p.

Si sta tentando di modificare questa stringa letterale tramite la funzione strrev che risulta in Comportamento non definito (UB) e l'arresto anomalo.

Il problema con i valori letterali stringa è che sono memorizzati in una posizione di memoria di sola lettura (definita dall'implementazione) e che i programmi utente non sono autorizzati a modificarlo. Se un programma tenta di farlo, provoca un UB.

Quindi, invece di utilizzare una stringa letterale, è necessario utilizzare una matrice.

Si deve usare:

char p[] = "GOOd"; 
+0

grazie ... ma dovrei imparare da questo errore ... e anche quante altre situazioni di questo genere di errori (UB) si ammalano? – sarsarahman

+0

@SARahman: Ci sono molti scenari che risultano in UB. Lo standard C lo indica chiaramente come tale, ma IMHO Experience è la strada da seguire, provi cose, ti blocchi, cerchi di trovare errori, fai domande qui se non puoi ricevere aiuto. Fai degli errori, impari da loro, Con la pratica saprai quali sono gli scenari comuni che causano UB. –

+0

se la stringa è definita come char * p = "GOOd"; allora come funziona la funzione di libreria standard? – sarsarahman

Problemi correlati