Вы когда-либо выделяли память только для первой книги в main - после этого она пытается записать следующий слот в массиве, который не указывает на выделенный блок памяти, что вызывает ошибку seg. Вам нужно будет выделить память для каждой книги, в которой вы хотите прочитать.
Кроме того, поскольку C не знает, каков размер массива, вы должны передать эту информацию в вызовы функций. (И я не понимаю, где вы определяете book_count.)
Вы можете попробовать что-то вроде этого:
void getUserInput(Book *s[], int *book_count, int max_book_count)
{
if (book_count == max_book_count) return; // If we've filled all the slots, we can't add anymore without causing trouble.
s[book_count] = malloc(sizeof(Book));
..
if(tolower(fgetc(stdin)) == 'y')
{
(*book_count)++;
getUserInput(s, book_count, max_book_count);
}
return;
}
int main (int argc, const char * argv[]) {
// insert code here...
Book *book_shelf[100];
int book_count = 0;
getUserInput(book_shelf, &book_count, 100);
// Make sure to free all the malloc'd data
}
Еще лучше в этой ситуации было бы просто использовать цикл и пропустить весь шаг рекурсии.
int main (int argc, const char * argv[]) {
// insert code here...
Book *book_shelf[100];
char response = 'y';
int book_count = 0;
while (book_count < 100 && response == 'y')
{
book_shelf = malloc(sizeof(Book));
response = getUserInput(book_shelf[book_count++]);
}
// make sure to free all the allocated data!
}
char getUserInput(Book *book)
{
// write input straight to book
printf("what is the book's title ?\n");
fgets(book->title, MAX_NAME_LENGTH, stdin);
...
return tolower(fgetc(stdin));
}