Certo che funziona, qui almeno hai un po' di spazio dove salvare
i caratteri che dai a scanf(), mentre a `char *nome' puoi dare solo
un valore, che ᅵ l'indirizzo di una locazione di memoria. Quando scrivi:
puntatore->nome = "Mario"
con la vecchia dichiarazione della struttura, di fatto scrivi:
puntatore->nome = &"Mario"[0];
cioᅵ l'indirizzo del primo carattere dello string literal "Mario",
e non hai spazio per nient'altro. Siccome devi inserire dei caratteri
a programma avviato, quindi in runtime, sarebbe piᅵ logico decidere
le dimensioni del tuo array di caratteri in runtime, quindi allocando
memoria dinamicamente. `scanf()' non ti permette di farlo. L'uso piᅵ
sicuro delle funzioni della famiglia 'scanf()' ᅵ se hai giᅵ una
sorgente e conosci giᅵ la formattazione dell'input, per esempio
se devi inserire caratteri in un array con 'sscanf()' ecc..
ma non conoscendo l'input a priori, nessuna ᅵ davvero sicura,
forse qualcuna lo ᅵ piᅵ di altre, ma..
Secondo me conviene scrivere una funzione di tipo "getline()", come
quella dello Standard POSIX che rialloca dinamicamente il buffer se
l'input ᅵ piᅵ grande del "previsto" (buffer allocato con `malloc()'
da te:
http://man7.org/linux/man-pages/man3/getline.3.html
che inoltre restituisce il numero di caratteri letti.
--
Vincenzo Mercuri