Dynamische Puffergrößen zu verwalten ist sehr aufwendig und man bekommt
leicht Probleme mit Speicherverschnitt. Die daraus resultierenden Fehler
sind auf Systemen mit kleinem Arbeitsspeicher kaum zu beheben und haben
zudem die Eigenart, sporadisch aufzutreten und schwer reproduzierbar zu
sein.
Deswegen ist die bessere Lösung, die maximal notwendige Pufferlänge zu
bestimmen und einen Struct zu definieren, der als letztes Element diesen
Puffer enthält.
Das CRC-Feld würde ich entweder vor den Puffer legen, oder dynamisch
nach dem Füllen des Puffers hinter das Ende der Daten schreiben.
Zudem funktioniert die Abfrage der Länge auf keinen Fall mit sizeof. Das
Resultat für sizeof muß dem Compiler bekannt sein sein - was es per
definition bei einem dynamischen Puffer nicht sein kann.
Deswegen muß in den struct auch noch ein Längenfeld, also etwa so:
1 | typedef struct{
|
2 | uchar header;
|
3 | uchar command;
|
4 | uchar length;
|
5 | uint crc;
|
6 | uchar daten[MAX_BUFLEN];
|
7 | }
|