No tengo C a mano, y dado que no lo uso mas que eventualmente, no creo ser el mas adecuado para hablar de esto. Pero char* no es un puntero a una cadena terminada en nulo?
Si "copias" el contenido del puntero, lo que estas copiando es eso, el puntero.. que del otro lado, apuntará a una dirección que no existe.
Por que no probás, por ejemplo, en lugar de esto, construir un arreglo de caracteres en la memoria compartida.
Se me hace mas fácil de explicar en pascal: el equivalente al tipo string[x] o a un array[0..x] of char.
Hasta luego.