В C есть мощный паттерн — flexible array member.
Вместо хранения заголовка и данных отдельно:
header → отдельно
payload → отдельно
можно сделать один непрерывный блок памяти:
+----------------+
| struct msg |
| len |
+----------------+
| payload data[] |
+----------------+
Код:
struct msg {
uint32_t len;
uint8_t data[];
};
struct msg *m = malloc(sizeof(*m) + n);
Один
malloc() → один блок памяти → один free().Почему это любят в системном коде:
✅ меньше аллокаций
✅ лучше работа с CPU cache
✅ проще сериализация
✅ нет лишних указателей и разрозненных данных
Такой подход используется в низкоуровневом коде: ядрах, драйверах, сетевых стеках.
До C99 часто писали:
uint8_t data[1];
и вручную обходили ограничения языка.
Теперь
data[] — официальный способ сказать:«После структуры здесь будет динамический массив данных».
Маленькая особенность C, которая помогает писать быстрый код на уровне ядра.
