c / expert
Snippet
Dynamische Speicherallokation mittels C99 Flexible Array Members
Flexible Array Members ermöglichen es einer Struktur, mit einer unspezifierten Array-Deklaration zu enden. Das Reservieren von Speicher für sizeof(struct) plus der variablen Payload-Größe erzeugt einen einzigen zusammenhängenden Block, was Allokations-Overhead reduziert und die Cache-Lokalität verbessert.
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>struct Packet {size_t length;unsigned char payload[];};struct Packet *create_packet(const unsigned char *data, size_t len) {struct Packet *p = malloc(sizeof(*p) + len);if (!p) return NULL;p->length = len;for (size_t i = 0; i < len; i++) {p->payload[i] = data[i];}return p;}
Erklärung
1
struct Packet { size_t length; unsigned char payload[]; };
Definiert eine Struktur mit einem unnummerierten Array-Member am Ende als Payload-Speicher.
2
struct Packet *p = malloc(sizeof(*p) + len);
Allokiert einen zusammenhängenden Speicherbereich für Header- und Payload-Elemente.
3
p->payload[i] = data[i];
Greift direkt auf den Speicherbereich zu, der an die Header-Felder angrenzt.