Questo di solito consente l'accesso idiomatico a istanze di struct di dimensioni variabili. Considerando il tuo esempio, in fase di esecuzione, si può avere una Bitmapset che viene disposto in memoria come questo:
-----------------
| nwords | 3 |
| words[0] | 10 |
| words[1] | 20 |
| words[2] | 30 |
-----------------
Così si finisce con un numero di runtime-variabile Uint32 "appeso fuori" alla fine della vostra struct, ma accessibile come se fossero definiti in linea nella struttura. Questo è fondamentalmente (ab) usando il fatto che C non esegue il controllo degli array di runtime per permetterti di scrivere codice come:
for (int i = 0; i < myset.nwords; i++) {
printf("%d\n", myset.words[i]);
}
fonte
2010-12-30 02:38:00
Grazie. Quindi questa allocazione difficile ha un problema per la struttura del riempimento della trama, diciamo se il numero di passaggi n è un numero dispari? – Oxdeadbeef
@Oxdeadbeef - Sì, suppongo. Non li archivierai realmente in una memoria contigua. Se si desidera un array di questi, è preferibile usare 'Bitmapset * a [20] = {NULL};' o 'Bitmapset ** a = malloc (20 * sizeof * a);'. –
La sintassi 'offsetof (Bitmapset, words [n])' è un'estensione (che sembra essere supportata dalla maggior parte dei compilatori). Per una conformità rigorosa, usare 'offsetof (Bitmapset, parole) + n * sizeof (p-> parole [0])'. – Jed