ci sono due questioni in gioco qui - la comprensione del tipo di il tuo puntatore e capire quali parti della memoria puoi modificare.
versioni recenti del problema del compilatore gcc un avvertimento per la linea:
char *mychar = "H";
anche se l'avviso può essere difficile da capire:
warning: deprecated conversion from string constant to ‘char*’
Quella riga di codice compila ancora e corre nonostante la avvertimento. Fondamentalmente, ti scoraggiano dal farlo - mychar ora è un puntatore ad un posto in memoria dove il compilatore ha posto i due caratteri, 'H' e '\ 0'. Se fai qualcosa come mychar [3] = 'X', stai scrivendo un'area della memoria di cui non sai nulla e che non controlli; a seconda dell'implementazione, ciò potrebbe causare un errore in fase di esecuzione. Se si aggiunge const:
const char *mychar = "H";
o
char const *mychar = "H";
l'avvertimento va via, ma ora hanno messo in chiaro a te stesso che non è possibile utilizzare questo puntatore per cambiare la memoria. Se in seguito fai
*mychar = 'E';
che causerà un errore di compilazione (non un avvertimento), perché non è possibile utilizzare un const char * a cambiare la memoria.
Ora, per quanto riguarda il messaggio di errore è effettivamente ottenuto, è perché hai scritto
*mychar = "E";
invece di
*mychar = 'E';
Quando il compilatore vede "E", si mette da parte un po 'di memoria nella eseguibile con i caratteri 'E' e '\ 0', e il valore di "E" è un puntatore (char *) a quel punto in memoria. * mychar è il carattere all'indirizzo indicato da mychar. Così
*mychar = "E";
sta prendendo il char * puntatore alla "E" stringa, e metterlo nella posizione in memoria puntata da MyChar. La cosa veramente confusa sul tuo messaggio di errore è che si riferisce a un numero intero; Suppongo che sia perché char può essere considerato un tipo di intero (il char senza segno può assumere qualsiasi valore compreso tra 0 e 255).
si sta tentando di impostare il valore di un carattere sul valore di un puntatore. E 'legale (anche se raramente una buona idea) per attivare un puntatore in un intero, così si potrebbe provare
*mychar = (char)"E";
ma con la mia versione di gcc (4.9.3) che produce un errore di compilazione perché il cast si riduce precisione: stai prendendo un valore a 32 o 64 bit e lo trasformi in un valore a 8 bit. Anche in questo caso, con la mia versione di gcc,
*mychar = (int)"E";
compila (se non ho fatto MyChar un const char *), ma produce un errore di run-time, perché sta cercando di cambiare memoria di sola lettura.
Forse ciò che realmente intendeva era
mychar = "E";
Questo cambia MyChar dalla punta al posto di memoria che contiene "H" al posto in memoria contenente "E". Questo compila e funziona correttamente.
Nota: dopo aver corretto l'avviso cambiando '" E "' a ''E'', non sorprenderti quando il tuo processo si blocca per scrivere in memoria di sola lettura. Stai invocando UB. – WhozCraig