Lo uso todo el tiempo cuando trato con paquetes de red. Un paquete es un conjunto de encabezados de varios protocolos. Es posible que tenga algo como esto:
encabezado ethernet: 14 bytes
Encabezado IP: 20 bytes
Encabezado TCP: 20 bytes
datos
Puedo definir una estructura usando esto:
struct {
struct ether_header ethh;
struct ip iph;
struct tcphdr tcph;
unsigned char data[];
} pkt;
- ¿Cómo funciona la propagación de DNS?
- ¿Cuál es la diferencia entre cambiar y puentear?
- ¿Cuál es la diferencia entre codificación y redes?
- ¿Cuáles son los tipos de redes?
- ¿Responden todos los dispositivos cuando se inunda un conmutador de red? ¿O solo el dispositivo cuya dirección MAC está en la MAC de destino?
Ahora, cuando entra un paquete en la escritura, la longitud del paquete está en el encabezado IP. Esto es dinámico, por supuesto, ya que todos los paquetes no son del mismo tamaño. Puedo hacer esto:
uchar *packet; // The packet from the wire with EH, IP
struct pkt *packetWithData;
int len=*((struct pkt *)packet)->iph.ip_len * sizeof(uchar) + sizeof(ether_header);
packetWithData = (struct pkt *)malloc(len);
memcpy(packetWithData,packet,len);
Ahora tengo espacio para todos los encabezados, así como para los datos, y puedo acceder a todos los campos de encabezado, así como a los campos de datos, utilizando una sola estructura con un solo puntero. Se libera en una sola operación. Si lo hice:
struct {
struct ether_header ethh;
struct ip iph;
struct tcphdr tcph;
unsigned char *data;
} pkt;
Necesitaría 8 bytes adicionales de memoria para el puntero a los datos por paquete. Copiarlo requiere dos operaciones: copiar encabezados, copiar datos. Dos libres, etc.
También lo uso para mantener cadenas de aminoácidos en proteínas.
struct {
uint64 *id;
uint64 aacids;
...
struct aacid acids[];
}
Ahora, a medida que construyo proteínas de longitud desconocida en alguna reacción biológica molecular, puedo reasignar y copiar la porción de ácidos y, cuando lo hago, tengo una sola estructura con la cadena de ácido que puedo pasar en el programa en lugar de muchos punteros a estructuras asignadas. Hago esto todo el tiempo con grandes datos donde se requiere un encabezado.