Programmare in C – Le stringhe: approfondimenti

Guida C

Stringhe e costanti stringa. Supponiamo di creare i due frammenti di codice qui sotto e di mandarli in esecuzione.

Frammento 1

{
    char *s;

    s="hello";
    printf("%s\n",s);
}

Frammento 2

{
    char s[100];

    strcpy(s,"hello");
    printf("%s\n",s);
}

Questi due frammenti producono lo stesso output, ma il loro comportamento all’interno è abbastanza diverso. Nel frammento 2 non si può scrivere s=”hello”; Per capire le differenze, si deve capire come le costanti stringhe lavorano in C.

Quando il programma viene compilato, il compilatore crea il file con il codice oggetto, che contiene il codice macchina e una tabella di tutte le costanti stringa dichiarate nel programma. Nel frammento 1, l’istruzione s=”hello”; fa in modo che s punti all’indirizzo della stringa hello nella tabella delle costanti stringa. Poiché questa stringa si trova nella tabella delle costanti stringa, e quindi nella parte che memorizza il codice eseguibile, non si può modificare. Si può solo utilizzare un puntatore per accedervi in modalità sola lettura.

Nel frammento 2, la stringa hello esiste nella tabella delle costanti, e la si può copiare nell’array di caratteri chiamato s. Poichè s non è un puntatore, l’istruzione s=”hello” non funzionerà nel frammento 2. Addirittura non è possibile portare a termine la compilazione del codice.

Usare le stringhe con malloc
Supponiamo di scrivere il programma seguente:

int main()
{
    char *s;

    s=(char *) malloc (100);
    s="hello";
    free(s);
    return 0;
}

Questo codice è compilabile, ma restituirà un errore di segmentation fault quando si arriva alla linea che contiene l’istruzione free durante l’esecuzione. La funzione malloc alloca un blocco di 100 bytes e fa in modo che s punti a questo blocco. Quando s=”hello”; viene eseguita, la variabile s punta alla stringa nella tabella delle costanti stringa, pertanto il blocco allocato rimane “orfano. Poiché s sta puntando verso la tabella delle costanti stringa”, la stringa non può essere cambiata. Ecco perchè la funzione free fallisce: non può deallocare blocchi di memoria che si trovano nell’area riservata a memorizzare temporaneamente in memoria i codici eseguibili.

Il codice corretto è:

int main()
{
    char *s;
    s=(char *) malloc (100);
    strcpy(s,"hello");
    free(s);
    return 0;
}

Errori da evitare in C

– dimenticare il carattere \0 come terminatore di stringa: tale dimenticanza può provocare dei bug molto subdoli. Ricordarsi di copiare anche il terminatore di stringa quando si effettua la copia di stringhe. Se si crea una nuova stringa, ricordarsi di mettere il simbolo \0 dove necessario.

Inoltre, durante la copia di una stringa, verificare che la stringa in cui verrà copiata sia grande abbastanza per contenere la stringa sorgente, incluso il carattere \0. Inoltre, se si utilizza un puntatore per puntare a caratteri, fare in modo che questi terminino con \0.

STAMPA

Leave a Reply