Обычно это позволяет идиоматическому доступу к экземплярам структуры переменного размера.Рассматривая ваш пример, во время выполнения вы можете иметь набор битовых карт, который выложен в памяти следующим образом:
-----------------
| nwords | 3 |
| words[0] | 10 |
| words[1] | 20 |
| words[2] | 30 |
-----------------
Таким образом, вы получите переменную времени выполнения uint32, "зависающую" в конце вашегоstruct, но доступная, как если бы они были определены внутри структуры.Это в основном (ab) использование факта, что C не выполняет проверку границ массива во время выполнения, чтобы позволить вам написать код как:
for (int i = 0; i < myset.nwords; i++) {
printf("%d\n", myset.words[i]);
}