When I send struct pointers, I tend to use some sort of pool of the structs, and the task filling in the struct gets a pointer to a free struct from the pool, fills it in, and send it, and then forgets that pointer, and either gets a new one from the pool, or just nulls out its pointer till it needs a new one.
The receiving task uses the pointer, and gets what it needs out of it, and then returns to struct pointer back into the pool.
The other option is to have a semaphore/task notification that the receive sets when it is done.with the structure, and the sender will wait on before it updates it after sending.