You have to allocate memory to any pointer if you want to do a copy. However you can always make a pointer point to already allocated memory. For example you can do the following:
p2.name = p1.name (p1.name is already allocated memory)
This is dangerous as there are more than one references to the same memory location. If you free either p1.name or p2.name, it results in a dangerous situation.
In order to copy the entire content you have to allocate memory to the pointers of the struct p2.
p2.name = <allocate memory>
copy individual struct members instead of a memcpy of the entire struct
This is because memory is not allocated in a contiguos manner. Also sizeof(struct) will give you size of the members of the struct and not the memory allocated to it.
For example sizeof(p2) = 8 = sizeof(p1)= sizeof(person)
even after allocating memory to members of p1.
It would be a different case had the members been char arrays .