Dichiarazione e inizializzazione stringa

di zio_mangrovia il
5 risposte
Non ho ben chiaro nella dichiarazione e inizializzazione di una stringa perchè nel primo caso il compilatore g++ mi genera un errore:

caso1:
char* tr ="test";
warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]


caso2:
char tr[] ="test";
Mentre in questo caso non ottengo nessun errore, non capisco.

Se invece volessi inizializzare una stringa con valore nullo secondo voi ha senso :
char tr[] ="";
oppure
char tr[] ="\n";

o sono la stessa cosa?

5 Risposte

  • Con

    char *tr ="test";

    assegni un puntatore costante ad un puntatore e il compilatore ti avvisa in quanto la stringa NON è modificabile in quanto dovresti intervenire sul testo nell'eseguibile. Dovresti scrivere

    const char *tr ="test";

    Se scrivi

    char tr[] ="test";

    allora non usi semplicemente un puntatore ma viene predisposto a runtime lo spazio nella sezione dati per la stringa e questa viene copiata dalla costante in tale spazio. In questo modo la stringa è modificabile perché intervieni sullo spazio in memoria e non sul testo.

    Per le altre domande, la prima stringa avrà lunghezza 0. La seconda stringa avrà lunghezza 1 in quanto contiene un carattere. Non mi sembrano la stessa cosa.
  • oregon ha scritto:


    Con

    char *tr ="test";

    assegni un puntatore costante ad un puntatore e il compilatore ti avvisa in quanto la stringa NON è modificabile in quanto dovresti intervenire sul testo nell'eseguibile.
    Mi risulta complesso comprendere un puntatore costante ad un puntatore.
    In questa definizione è implicito che tr è un puntatore costante cioè che non è modificabile l'area di memoria utilizzando questo identificatore tr, giusto?
    Dove posso trovare documentazione facile da leggere in merito?
    Per le altre domande, la prima stringa avrà lunghezza 0. La seconda stringa avrà lunghezza 1 in quanto contiene un carattere. Non mi sembrano la stessa cosa.
    ok. capito.
  • Scrivo da un cellulare ... è un

    puntatore a costante

    non un puntatore costante. Il puntatore a costante a cui mi riferisco è

    "test"

    Sono argomenti del linguaggio C, presenti in qualsiasi libro di C
  • Ah ok, quindi nel secondo caso la differenza sostanziale è che viene allocata memoria per l'identificatore tr mentre nel primo caso si punta ad una zona di memoria non modificabile (immagino che la stringa test da qualche parte risiederà in memoria che non è modificabile però).
    Ho detto cosa giuste?
  • Sì, la stringa "test" esiste nell'eseguibile, praticamente nella sezione delle costanti non modificabili e ha un suo indirizzo.
Devi accedere o registrarti per scrivere nel forum
5 risposte