c / expert
Snippet
Dynamische Header-Strukturen mit flexiblen Array-Mitgliedern nach C99
Demonstriert das flexible Array-Mitglied (payload[]) gemäß C99, welches dynamische Strukturgrößen mit einer einzigen Speicherallokation ermöglicht, sodass Header-Metadaten und Daten-Payload zusammenhängend im Speicher liegen.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>#include <stdlib.h>#include <stdint.h>typedef struct {uint32_t length;uint32_t capacity;uint8_t payload[];} DynamicPacket;DynamicPacket* create_packet(uint32_t cap) {DynamicPacket* pkt = malloc(sizeof(DynamicPacket) + cap * sizeof(uint8_t));if (!pkt) return NULL;pkt->length = 0;pkt->capacity = cap;return pkt;}
Erklärung
1
uint8_t payload[];
Deklariert ein flexibles Array-Mitglied ohne Größenangabe am Ende der Struktur, das standardmäßig keinen Platz beansprucht.
2
sizeof(DynamicPacket) + cap * sizeof(uint8_t)
Berechnet die Allokationsgröße durch Kombination der festen Header-Größe mit dem dynamischen Payload-Puffer.
3
if (!pkt) return NULL;
Führt eine erforderliche Allokationsprüfung durch, bevor Strukturzeiger dereferenziert werden.