E sono entrambe sbagliate.
Il primo errore è qui (quello che genera il warning).
codice:
char* strnome, strcognome;
Solo strnome è un char pointer, l'altro è solo un char.
Perché entrambi siano puntatori devi scrivere:
codice:
char *strnome, *strcognome;
Il secondo errore è che per quei puntatori non allochi spazio, quindil il massimo che ottieni è un bel crash. Alloca memoria sufficiente.

Il terzo errore è quel sizeof(strnome) che al massimo restituisce 4 (la dimensione di un puntatore su piattoforme 32bit).
Quel parametro semmai deve valere: strlen(s->autore->nome).

Qui per altri dettagli:
http://www.cplusplus.com/reference/c...tring/strncpy/