Tu te compliques en passant par les pointeurs, c'est voulu?
Ligne 14 ta fonction retourne un pointeur sur void
Ligne 15 si on veut être rigoureux y'a un ptit soucis
printf("%s, published in %d, by %s.", (*b).title, (*b).publication_year, (*b).author);
Tu veux afficher une chaîne caractères, un entier et une chaîne de caractères.
(*b).title c'est bien une chaîne de caractères ( qu'on peut aussi écrire b->title)b->publication_year est bien un entier- b->author bah c'est pas une chaîne de caractère c'est un objet de type Person il faudrait écrire
b->author->name
Et tes 3 Warnings (ligne 34,40,46)c'est un peu le même principe, l'écriture ne provoque pas d'erreur de compilation mais le résultat n'est pas du tout assuré.
Une façon d'écrire serait: hp1.author = &jfk;
Et la ligne 48 bin ... que se passe t'il? pourquoi un * et pourquoi redéfinir hdm1 en pointeur dans l'appelle de la fonction
print_book(&hdm1);
Et le résultat dans la console sera Nothern lights, published in 1995, by Philip Pullman.
J'pense que le code est plus simple sans passer par des pointeurs: