Programación General => C/C++ => Mensaje iniciado por: truliano en Viernes 17 de Junio de 2011, 23:29
Título: Se puede aplicar un memcpy a dos estructuras diferentes
Publicado por: truliano en Viernes 17 de Junio de 2011, 23:29
Esta es mi primera consulta, he estado programando hace tiempo pero por fin he estado utilzando el memcpy de modo de optimizar mi desarrollo, la consulta es por ejemplo:
si tengo
Código: C++
typedefstruct A
{
int a;
float b, c;
int b;
}
typedefstruct A
{
int a;
float b, c;
}
A a;
B b;
size_t sizea =sizeof(float)*2+sizeof(int);
size_t sizeb =sizeof(float)+sizeof(int);
memcpy(&a, &b, sizea);
memcpy(&a, &b, sizeb);
Lo ecribi a la rapida unicamente para realizar la pregunta, lo que me interesa es saber si es que la copya de esa forma me realiza una copia de los datos uno a uno como han sido guardados, o sea con el primer memcpy copia los valores de de a, b y c de la estructura "b" a "a", y con el segundo memcpy los valores de a y b de la estructura "b" a "a"
Saludos,
Título: Re: Se puede aplicar un memcpy a dos estructuras diferentes
Publicado por: ProfesorX en Sábado 18 de Junio de 2011, 01:52
En tu ejemplo, estas definiendo struct A dos veces, supongo que la segunda en realidad era struct B, ademas en la primer estructura A, pones dos miembros b, supongo tambien que debio ser miembro d el cuarto, pero bueno dices que lo escribiste a la rapida, sin embargo, te lo aclaro, no sea que te vayas con una idea errada si no esta bien definido.
Ahora, respondiendo a tu pregunta, suponiendo que defines tu estructura A, con sus miembros exactamente del mismo tipo y en el mismo orden que estructura B, de la siguiente manera:
Código: C++
typedefstruct A
{
int a;
float b, c;
int d;
};
typedefstruct B
{
int a;
float b, c;
};
dire que SI, tu suposicion es correcta, el contenido de los miembros a, b y c se copiaran de B a A en el primer caso, y el contenido de a y b, en el segundo caso.
Pero cuidado aqui, usar memcpy puede ser peligroso a menos que sepas exactamente lo que estas haciendo, ya que no comprueba la variable destino, para verificar que sea del tamaño adecuado, ni tampoco que lo que estes haciendo sea lo correcto o este en el orden correcto.
Por ejemplo, supongamos que inviertes la definicion de los miembros, de la siguiente manera:
Código: C++
typedefstruct A
{
int a;
float b, c;
int d;
};
typedefstruct B
{
// invierto la definicion
float b, c;
int a;
};
Entonces en este caso, lo que sucederia es que el contenido de struct B float b, se guardaria en struct A int a, y el contenido de struct B float c se guardaria en struct A float b, ya que ambos tipos float e int, se almacenan en 4 bytes. Ocurriria algo mas grave si en lugar de float utilizaras double, ya que double ocupa 8 bytes, entonces no coincidiria el tamaño del tipo origen con el tipo destino, ¿te das cuenta a que me refiero?
Dicho eso, y como dije antes, solo ten cuidado al usar memcpy y asegurate de saber lo que haces.
Saludos :)
Título: Re: Se puede aplicar un memcpy a dos estructuras diferentes
Publicado por: truliano en Domingo 19 de Junio de 2011, 00:51
Muchas gracias,
Realmente como lo escribi a la rapida lo entendiste perfecto, y si era eso lo que tenia pensado pero no lo habia probado. Esto me permite realizar un paso de los datos de mi estructura simulacion a mi estructura guardado que son distintas.