strcpy(who, new_student->name);
strcpy takes destination as it's first value and it doesn't limit the input buffer (thousands of buffer overflows are/were caused by this). You should use strncpy. Anyway, you're attempting to write to a string literal, which is an undefined behaviour.
Quote (N1570 @ 6.4.5.7)
It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.
Besides that:
1) why are you taking char* instead of char const* as the name parameter? If only you had the correct function prototype, the compiler would warn you about cast from char const* to void*!
2) why are you using the same name for a function and a variable inside of the function? This never ends well :|
3) what is the definition of struct Student? I don't see why age is a pointer.
4) if name malloc fails, you're left with a memory leak. If age malloc fails, you're left with two.