Как в C++ создать массив структур неизвестной длины внутри функции?
Ошибка:scanf("%s", *books[i].name); Вы вместо указателя на имя передаёте значение первого символа, правильно:scanf("%s", books[i].name);
Ошибка:scanf("%d", books[i].price);
scanf("%d", books[i].page_n);
scanf("%d", books[i].pubhouse.year); Вы вместо адреса переменной передаёте её значение, правильно:scanf("%d", &(books[i].price));
scanf("%d", &(books[i].page_n));
scanf("%d", &(books[i].pubhouse.year));
Почему бы вам не использовать списки?
А ответ довольно простой - память под массив вы выделили, а структуру не инициализировали.