Domanda

Sto cercando di fare un po 'di sviluppo C classico in Visual C ++ 2008 che modificherà i caratteri di una stringa in questo modo:

void ModifyString(char *input)
{
  // Change first character to 'a'
  *input = 'a';
}

Sono sempre un'eccezione non gestita quando provo a cambiare un personaggio. Sembra che ho potuto fare questa operazione in Visual Studio 6 o utilizzando gcc, ma forse sono solo dimenticare qualcosa. Ha Visual Studio in qualche modo passare char * per valore (gestione della memoria). Se è così, come faccio a disattivare questa funzionalità?

È stato utile?

Soluzione

Probabilmente stai passando una qualche parte letterale di stringa:

ModifyString("oops");  // ERROR!

C e C ++ consentono di lanciare in modo implicito da stringhe letterali (che hanno il tipo const char[]) per char*, ma tale uso è deprecato. Le costanti stringa possono essere assegnati in memoria di sola lettura (e di solito lo sono), quindi se si tenta di modificarli, si otterrà una violazione di accesso (aka segmentation fault o errore del bus). Se il compilatore non mette le costanti di stringa in memoria di sola lettura, il programma continuerà a funzionare, ma è un comportamento indefinito.

Il modo corretto per farlo è quello di copiare la stringa in un buffer scrivibile:

// one way:
char mystring[] = "test";
ModifyString(mystring);  // ok

// another way:
char mystring[64];  // make sure this is big enough!!
strcpy(mystring, "test");
ModifyString(mystring);  // ok

Altri suggerimenti

è l'ingresso di una stringa letterale? Questo è probabilmente il problema. In caso contrario, sarà necessario inserire il codice di più, come il puntatore ha in qualche modo finito che punta a una posizione di sola lettura in memoria.

E 'impossibile rispondere a questa domanda senza vedere come ModifyString viene chiamato. La funzione stessa è corretta supponendo che è contratto deve essere superato un valore non nullo.

Tuttavia è possibile per il sito di chiamata a fallire eseguendo una serie di cose

  • Passando NULL
  • Passando const char per mezzo di un cast male

Non posso dire esattamente perché questo non funziona, ma il problema è nel codice, non Visual Studio. Per qualche ragione, si sta passando un puntatore non valido per la funzione. E 'sia un puntatore nullo, o che punti a un certo indirizzo non si dispone di accesso in lettura a.

Se pubblichi un po 'del codice (dove è la funzione chiamata, e come si chiama?), Potremmo essere in grado di evidenziare il problema esatto.

Il motivo per cui ha lavorato in GCC o VC6 è semplicemente che si tratta di un comportamento indefinito. La serie C ++ non dice che "questo dovrebbe funzionare", o "questo dovrebbe causare un crash". Tutto può succedere se si scrive nella memoria non si ha accesso. E a seconda del compilatore, e il sistema si sta eseguendo l'applicazione su, l'indirizzo si finisce Accesso varierà. Per pura fortuna, si colpisce un indirizzo che ha causato una violazione di accesso quando si compila con VC2008. Sotto GCC e VC6, non eri così fortunati, e ottenuto il codice che sembrava funzionare , e semplicemente scritto a qualche indirizzo di spazzatura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top