Realloc перераспределяет память, поэтому, возможно, память, указанная в d, будет выпущена, поэтому double_array_size должен отредактировать d, вы можете попробовать:
void double_array_size(struct course** d, int new_size){
*d = realloc(*d, new_size * sizeof(struct course));
.
.
.
}