Esto es generalmente para permitir el acceso idiomático a instancias de estructuras de tamaño variable. Teniendo en cuenta su ejemplo, en tiempo de ejecución, es posible que tenga un Bitmapset que se presenta en la memoria de esta manera:
-----------------
| nwords | 3 |
| words[0] | 10 |
| words[1] | 20 |
| words[2] | 30 |
-----------------
por lo que terminan con un número de tiempo de ejecución variable de uint32 "colgando" al final de su estructura, pero accesible como si estuvieran definidos en línea en la estructura. Esto es básicamente (ab) utilizando el hecho de que C no hace ninguna comprobación de límites de matriz en tiempo de ejecución para permitirle escribir código como:
for (int i = 0; i < myset.nwords; i++) {
printf("%d\n", myset.words[i]);
}
Thanks. Entonces, ¿esta complicada asignación tiene un problema para el relleno de estructuras, por ejemplo, si el n pasado es un número impar? – Oxdeadbeef
@Oxdeadbeef - Sí, supongo. Realmente no almacenará una matriz de ellos en la memoria contigua. Si quisiera una matriz de ellos, probablemente sería mejor usar 'Bitmapset * a [20] = {NULL};' o 'Bitmapset ** a = malloc (20 * sizeof * a);'. –
La sintaxis 'offsetof (Bitmapset, words [n])' es una extensión (que es compatible con la mayoría de los compiladores). Para cumplimiento estricto, use 'offsetof (Bitmapset, words) + n * sizeof (p-> words [0])'. – Jed