Обычно это разрешает идиоматический доступ к экземплярам структур переменной длины. Учитывая ваш пример, во время выполнения, вы можете иметь Bitmapset, который заложен в памяти, как это:
-----------------
| nwords | 3 |
| words[0] | 10 |
| words[1] | 20 |
| words[2] | 30 |
-----------------
Таким образом, вы в конечном итоге с выполнения переменной числа uint32 «висит от» конца вашей структуры, но доступны так, как если бы они были определены внутри структуры. Это в основном (ab), используя тот факт, что C не проверяет границы массива во время выполнения, чтобы вы могли писать код:
for (int i = 0; i < myset.nwords; i++) {
printf("%d\n", myset.words[i]);
}
Спасибо. Так будет ли это сложное распределение иметь проблемы для объекта прокладки структуры, скажем, если переданное n является нечетным числом? – Oxdeadbeef
@ Oxdeadbeef - Да, я полагаю. Вы не будете хранить массив из них в непрерывной памяти. Если вам нужен массив, вам, вероятно, будет лучше использовать «Bitmapset» a [20] = {NULL}; 'или' Bitmapset ** a = malloc (20 * sizeof * a); '. –
Синтаксис 'offsetof (Bitmapset, words [n])' является расширением (которое, как правило, поддерживается большинством компиляторов). Для строгого соответствия используйте 'offsetof (Bitmapset, words) + n * sizeof (p-> words [0])'. – Jed