que problemas puede causar memcpy al introducir un buffer de datos en un struct

Iniciado por marvic, 7 Octubre 2012, 21:55 PM

0 Miembros y 1 Visitante están viendo este tema.

marvic

Hola

Estoy documentando un programa y necesito literatura (en ingles mejor) para explicar  que problemas podria haber al cambiarlo de maquina,
la cuestion es qeu tengo unos datos generados de una estructura, en forma de buffer, que luego yo vuelvo a asignar a la estructura de la siguiente manera:

memcpy(&estructura1,"\x00\x00\x00\x00\x00\x00\x00\x00",8);

en este caso
estructura1{
    int a;
    int b;
}

pero el struct podria ser de cualquier tipo de componentes. arrays char...

Necesito literatura sobre si esta manera de copiar el valor directamente podria dar problemas en diferentes arquitecturas por gestionar la memoria del struct de diferente manera..

Alguien me podria ayudar, realmente necesito encontrar apuntes, o algun libro o algun sitio donde pueda leer sobre esto..

Muchas gracias


rir3760

Cita de: marvic en  7 Octubre 2012, 21:55 PMEstoy documentando un programa y necesito literatura (en ingles mejor) para explicar  que problemas podria haber al cambiarlo de maquina
La función "memcpy" no debe dar problemas siempre y cuando las direcciones de origen y destino así como el numero de caracteres a copiar sean los correctos. Aquí nos convendría que dieras una descripción mas detallada del programa.


En cuanto al caso particular que mencionas:
Cita de: marvic en  7 Octubre 2012, 21:55 PMmemcpy(&estructura1,"\x00\x00\x00\x00\x00\x00\x00\x00",8);

en este caso
estructura1{
    int a;
    int b;
}
Das por sentado que el tamaño del tipo "int" es cuatro, si ese no es el caso, por ejemplo si "sizeof(int)" es igual a dos, la función escribiría fuera de la región en memoria del objeto y eso seria un error.


Cita de: marvic en  7 Octubre 2012, 21:55 PMNecesito literatura sobre si esta manera de copiar el valor directamente podria dar problemas en diferentes arquitecturas por gestionar la memoria del struct de diferente manera.
No recuerdo uno enfocado específicamente en el tema. Una opción seria leer los estándares de C (o alguno de sus borradores) pero son documentos muy pesados (muy técnicos). Otra opción seria leer un libro enfocado en C estándar, buena parte de las recomendaciones que se dan al seguir el estándar tienen que ver con el tema de la portabilidad.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

do-while

¡Buenas!

Otro posible error tendria que ver con la alineacion de los registros dentro del struct. Los distintos campos no tienen porque mantener la misma posicion relativa con respecto a la direccion en la que empieza el struct en distintos compiladores.

Te recomiendo que no utilices un buffer fijo, sino que ese buffer lo crees a partir de otro struct. Esto no tampoco te asegurara que siempre funcione bien. Por ejemplo, si compilas el programa con distintos compiladores que guarden los struct en ficheros binarios (siempre y cuando guardes el bloque entero del struct aplicando un sizeof para saber los bytes que ocupa), volveras a poder tener problemas con la alineacion de los campos del struct, y te podra volver a dar errores de datos mal inicializados o fallos de segmentacion...

Si quieres asignar valores a un struct desde un buffer utilizando memcpy, y que te funcione siempre, tendras que comprobar los tamaños del tipo de dato de tu compilador y la alineacion de los campos dentro del struct y tendras que compilar siempre con dicho compilador. (Si esto es incorrecto corregidme, pero creo que es asi)

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!