penso che il più vicino si può venire è di inizializzare una pianura char[]
(non un char * []) con un letterale:
char foo[] = "foo";
Che sarà ancora eseguire una copia ad un certo punto però.
L'unico altro modo per aggirare sarebbe utilizzare le chiamate a livello di sistema per contrassegnare la pagina in cui una stringa letterale risiede come scrivibile. A quel punto non stai davvero parlando di C o C++, stai parlando davvero di Windows (o di qualsiasi sistema su cui stai lavorando). Probabilmente è possibile sulla maggior parte dei sistemi (a meno che i dati non siano realmente nella ROM, ad esempio potrebbe essere il caso su un sistema embedded), ma di sicuro non conosco i dettagli.
Oh, e non dimenticate che nel tuo esempio:
char* foo[] = {
"foo",
"foo"
};
Dal momento che la standard (C99 6.4.5/6 "letterali stringa"), dice:
E 'specificato se questi array sono distinti purché i loro elementi abbiano i valori appropriati.
Non c'è certezza se i 2 puntatori di quella matrice puntino agli stessi oggetti o separati. Quasi tutti i compilatori avranno quei puntatori che puntano allo stesso oggetto allo stesso indirizzo, ma non sono obbligati e alcune situazioni più complicate di puntatori a stringhe letterali potrebbero avere il compilatore in arrivo con 2 stringhe identiche separate.
Si potrebbe anche avere uno scenario in cui esiste 'all'interno' un'altra stringa letterale:
char* p1 = "some string";
char* p2 = "string";
p2
può ben essere puntato verso la fine della stringa puntata da p1
.
Quindi, se inizi a cambiare i valori letterali stringa con qualche trucco che puoi eseguire su un sistema, potresti finire a modificare involontariamente alcune "altre" stringhe. Questa è una delle cose che un comportamento indefinito può portare con sé.
fonte
2010-06-16 16:30:14
No, in base allo standard che modifica un comportamento non definito evocato dalla stringa letterale. Il dato stesso è 'const', anche se si ha un puntatore non-' '' '' '' '' Se lo fai, rischi di avere problemi di esecuzione, di esecuzione o di modifica o persino di patch del compilatore. –
Non ha senso muovere una stringa ** letterale **. Forse è più chiaro con int: come faccio a compilare '5 = 7'? – fredoverflow
Anne, questo non è qualcosa che dovresti fare, ma è possibile in pratica, contro quello che dice lo standard C++. Ho scritto un articolo che spiega come farlo in sistemi UNIX che hanno un'interfaccia di protezione della memoria esposta ai programmi dello spazio utente, [guardalo qui] (http://lazarenko.me/2013/05/01/how-constant -is-a-costante /). –