c / expert
Snippet
Flexible Array-Elemente (FAMs)
Flexible Array-Elemente (eingeführt in C99) erlauben es einer Struktur, mit einem Array ohne feste Größe zu enden. Diese Technik ermöglicht es, mit einer einzigen Heap-Allokation sowohl den Metadaten-Header als auch die Nutzlast variabler Länge zu speichern, was die Cache-Lokalität verbessert und den Verwaltungsaufwand im Vergleich zu einem separaten Zeiger reduziert.
snippet.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>#include <stdlib.h>#include <stdint.h>struct DynamicBuffer {size_t size;uint8_t data[]; // Flexible array member};int main() {size_t n = 1024;// Allocate header + n bytes for the arraystruct DynamicBuffer *buf = malloc(sizeof(struct DynamicBuffer) + n);if (!buf) return 1;buf->size = n;for (size_t i = 0; i < n; i++) buf->data[i] = (uint8_t)(i % 256);printf("Size: %zu, First element: %u\n", buf->size, buf->data[0]);free(buf);return 0;}
Erklärung
1
uint8_t data[];
Das flexible Array-Element muss das letzte Element der Struktur sein und hat keine festgelegte Größe.
2
malloc(sizeof(struct DynamicBuffer) + n);
Speicher wird für die Basisgröße der Struktur plus die gewünschte Anzahl an Array-Elementen reserviert.