0 Tage Serie
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
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 array
struct 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.