Q:

2d Linked list memory not carrying over

I've been struggling for a while with a particular homework function that involves using a list and dynamically allocating memory to the second dimension of said list and populating its elements, using the following structs:
    13 typedef struct BookIds{
    14     int id;
    15     struct BookIds* next;
    16 }bookIds;
    18 typedef struct Student{
    //Unimportant struct elements
    23     bookIds* wishlist;
    24     struct Student* next;
    25 }student;

and then calling
 void addWishlist(student* head, char* wishListfile) {
 //cannot modify parameters or return type
 191     FILE* f = fopen(wishListfile, "r");
 192     student* current = head;
 193     int i;
 194     int* wish = malloc(sizeof(int) * 4);
 195     while (current != NULL) {
 196         current->wishlist = malloc(sizeof(bookIds));
 197         fscanf(f, "%d %d %d %d", (wish), (wish+1), (wish+2), (wish+3));
 198         for (i = 0; i < 4; i++) {
 199             current->wishlist->id = *(wish+i);
 200             current->wishlist->next = malloc(sizeof(bookIds)) 
 201             current->wishlist = current->wishlist->next;
 202         }
 203         current = current->next;
 204     }
 205     free(wish);
 206     fclose(f);
 207 }

The problem is that after the function call, the second array list loses its memory (all elements are NULL) because it's a pass by val. Normally I would opt to return a list or use a double pointer as a parameter but those are not an option for this assignment. Any help/programming advice would be much appreciated. 

A:

The problem is that after the function call, the second array list loses its memory (all elements are NULL) because it's a pass by val.

No that is not the problem here as none of the arguments passed to the function are change inside the function.
Instead, I think your problem is here:
 198         for (i = 0; i < 4; i++) {
 199             current->wishlist->id = *(wish+i);
 200             current->wishlist->next = malloc(sizeof(bookIds)) 
 201             current->wishlist = current->wishlist->next;
 202         }

It seems you want wishlist to contain 4 elements but in line 201 you change current->wishlist to point to the last element in the chain. So you end up with just a single uninitialized element.
You can see this by making a simple drawing of the elements and the pointer:

As you can see, you have lost the first element after executing line 201.
When the function completes, it looks like this:

You have lost all elements except the last one (which btw is uninitialized).
So you need to rewrite the above lines so that you don't change current->wishlist in line 201. Also remember to set the last next pointer to NULL.
Maybe you could replace line 196-202 with something like:
     fscanf(f, "%d %d %d %d", (wish), (wish+1), (wish+2), (wish+3));
     bookIds* p;
     for (i = 0; i < 4; i++) {
          if (i == 0) {
               current->wishlist = malloc(sizeof(bookIds));
               p = current->wishlist;
          } else {
               p->next = malloc(sizeof(bookIds));
               p = p->next;
          }
          p->id =  = *(wish+i);
          p->next = NULL;
      }

BTW: You should also add checks for malloc and fscanf being successful.

