08/10/2012, 01:49
|
| | Fecha de Ingreso: junio-2010 Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 5 meses Puntos: 73 | |
Respuesta: Asignar valores a un struct sabiendo el tamaño pero no los campos memcpy es estándar, simplemente copia el número de bytes que se indique de la fuente al destino, tal cual. En ese sentido no debe haber problemas al compilar en otra máquina. Ünicamente hay que tener en cuenta que los bloques de memoria de origen y de destino no deben solaparse, en tal caso el comportamiento no está definido. Si hay solapamiento, debe utilizarse la función memmove.
Problemas que pueden presentarse:
- Con las cadenas de caracteres no hay problema, se guardan tal cual.
- Con los números, ya sean enteros o en coma flotante, depende del tipo de máquina. Las que tienen el formato llamado Little-endian (procesadores INTEL, por ejemplo) guardan en primer lugar el byte menos significativo, y el más significativo al final. Las que tienen el formato llamado Big-endian (procesadores Motorola, por ejemplo) guardan en primer lugar el byte más significativo, y el menos significativo al final. Así, por ejemplo, el número 1000 (hexadecimal 03E8), como número entero de 32 bits, se guardará como E8 03 00 00 en una máquina INTEL, y como 00 00 03 E8 en una máquina Motorola. Lo mismo ocurre con el orden de los bytes de los números en coma flotante (sean del tipo que sean). Esto también afecta a estructuras que correspondan a campos de bits.
- Puede haber diferencias con los modos de utilizar las direcciones. Por ejemplo, en un sistema operativo de 16 bits las direcciones de comienzo de las variables suelen ser múltiplos de 2, y en uno de 32 bits suelen ser múltiplos de 4, con lo que podría haber espacio sin utilizar. Dependiendo del sistema operativo y del compilador, sería posible "empaquetar" las variables y que comenzasen en direcciones "extrañas", a costa de la velocidad. Por ejemplo, los compiladores Borland para MS-DOS permitían esto (optimización para espacio).
Así al pronto no se me ocurren más, si tienes alguna otra duda ya sabes dónde estamos.
Saludos, |