Ahora que me doy cuenta..... ¿ Estas usando C++ ? ¿O estas usando C con un puntero a una funcion sobre un struct? (al ver el EEpromRTC.readchar() )
Porque estamos hablando de dos cosas muy distintas entre uno y otro. Y tu aproximacion al trabajo de strings es a C y veo que intentas hacer cosas como si fuera C++ (copiar strings con una sola asignacion).
--------------------------------------------------------------------------------------
y el contenido de p_save[0] que no sufra cambio una vez que se guarde
Bueno ahi tenes el problema el cual no vas a poder hacerlo con un array de punteros a char...
Si queres guardar CONTENIDO, entonces tu array p_save va a necesitar el lugar para hacerlo, y hacerlo caracter a caracter. Supongamos que p_data es de maximo 15 caracteres incluido el nulo entonces tu p_save seria:
static char p_save[9][15];
Podrias hacer un array de punteros si quisieras y que apunte a la memoria. La otra y es que no se usa mucho en los microcontroladores es utilizar la memoria dinamica (con todo lo que conlleva). Y ahi si tendrias tu array de punteros.
De todas formas hacer esto:
Nunca te va a copiar los datos.. Solo la direccion de donde comienza p_data, por lo que si modificas p_data, lo que accedes desde p_save[0] es el p_data modificado.
Lo que tenes que hacer es copiar caracter a caracter hasta el caracter nulo empezando por p_save[0][0]
--------------------------------------------------------------------------------------------------------
Espero generar un ejemplo mas practico de lo que estas intentando hacer:
Direccion Nombre Contenido
0x0001 p_data "Hola mundo"
0x0020 p_save[0] 0x0001
Tenes algo asi... luego de tu p_save[0] = p_data .... Observaras que p_save[0] sigue apuntando a 0x0001.
En caso de que modifiques p_data y pongas otro string quedaria:
Direccion Nombre Contenido
0x0001 p_data "Peperepe repepe"
0x0020 p_save[0] 0x0001
Es decir p_save[0] no cambia y sigue apuntando a p_data, por lo que no vas a guardar el VALOR, y es aca donde te equivocas con los punteros. Vos estas buscando algo asi:
Direccion Nombre Contenido
0x0001 p_data "Peperepe repepe"
0x0020 p_save[0] "Peperepe repepe"
Y para eso necesitas que p_save tenga lugar para tener todo el string.. es decir es un array de strings.
Existe otra forma de que los punteros SI funcionen.
Si en el caso de que los strings son constantes y almacenados en la FLASH y p_data es simplemente un puntero a char (y no un array) Es posible guardar el puntero. Pero eso significa que p_data lo unico que va a servir es para apuntar a otro string que este en la FLASH, y no para almacenar algun dato aleatorio como lo estas buscando.