Ciao a tutti,
volevo porvi una questione relativa a quanto scritto sul K&R al capitolo 6.2.
Dopo un'introduzione chiara sulle strutture dati, la presentazione dei puntatori e la doppia notazione per accedere ai membri delle medesime, operatori (.) e (->), soffermandosi anche sulla precedenza degli operatori a tal proposito a un certo punto viene dichiarata la seguente struttura anonima:
struct {
int len;
char *str;
} *p;
Dichiarando contestualmente un suo puntatore (*p).
Immediatamente dopo per far osservare che l'opearotore "->" ha precedenza sull'operarore "prefisso" ++ scrive:
++p->len;
Ma senza troppo dubitare questo frammento di codice va in segmentation fault. Evidentemente perché il puntatore p non punta ancora a nessuna zona di memoria valida. E' un errore espositivo o il K&R dà per scontato, secondo voi, che il puntatore sia successivamente inizializzato? Ma data per buona questa ipotesi come posso assegnare un indirizzo partendo da una struttura anonima? In generale a cosa serve una struttura anonima? Inoltre, perché non posso assegnare un valore di inizializzazione durante la dichiarazione della struttura? Infatti il seguente frammento mi dà errore:
struct {
int len = 10;
char *str;
} *p;
In conclusione per far "funzionare" il frammento
++p->len;
ho dovuto rendere la struttura non anonima dichiarare "un'istanza" e assegnarne l'indirizzo al puntatore, nel seguente modo:
struct oggetto {
int len;
char *str;
} *p;
struct oggetto o;
o.len = 10;
o.str = "Sono un array di caratteri di soprannome stringa.";
p = &o;
p->len = 5;
printf("++p->len %d\n",++p->len);
Chiedo anticipatamente scusa se non ho compreso appieno il senso del testo e vi ringrazio per i chiarimenti che vorrete fornirmi.
Un saluto e buona giornata.