The intention of the function is to populate the struct from buffer 'source'
You haven't created any struct to populate.
and then call 'useStruct' (which updates a global based on the contents of the pointer to struct passed to it).
That part is OK.
I think the code allocates memory for the pointer on the stack (so pointing to some random location),
Yes. memory for the pointer is the key here. Not memory for the struct.
memcopy then pushes bytes from 'source' (overwriting pStruct, so that now points somewhere else),
Yes. But you overwrote the pointer with the struct itself. The pointer doesn't make any sense now. Plus, the pointer is typically much smaller than a struct, so you overwrote not just the pointer, but also some memory after it. Which is very bad thing, because nobody can tell who used that memory and for what, so there possibly was something important there and you've destabilized your program now.
and useStruct uses content of pStruct as pointer to struct.
Yes, it uses content of pStruct as pointer to struct - but as I said it now contains the struct itself, not just a pointer.
You must treat the pointer as a distinct type than what it points at. Eg my finger is a pointer and I am pointing it at a Statue Of Liberty. What you did is you copied the content of Statue Of Liberty into a finger. It won't fit. What you need is to get another Statue-sized memory place, copy the original Statue there and then you can take a finger and point it into new Statue.