Es gibt einige Nachteile in Bezug darauf, wie Strukturen manchmal verwendet werden, und es kann gefährlich sein, wenn Sie die Auswirkungen nicht durchdenken.
Wenn Sie für Ihr Beispiel eine Funktion starten:
void test(void) {
struct header;
char *p = &header.data[0];
...
}
Dann sind die Ergebnisse undefiniert (da niemals Speicher für Daten zugewiesen wurde). Dies ist Ihnen normalerweise bekannt, aber es gibt Fälle, in denen C-Programmierer wahrscheinlich daran gewöhnt sind, Wertesemantik für Strukturen zu verwenden, die auf verschiedene andere Arten zusammenbricht.
Zum Beispiel, wenn ich definiere:
struct header2 {
int len;
char data[MAXLEN];
}
Dann kann ich zwei Instanzen einfach durch Zuweisung kopieren, dh:
struct header2 inst1 = inst2;
Oder wenn sie als Zeiger definiert sind:
struct header2 *inst1 = *inst2;
Dies funktioniert jedoch nicht, da das variable Array data
nicht kopiert wird. Was Sie wollen, ist, die Größe der Struktur dynamisch zu ändern und mit memcpy
oder einer Entsprechung über das Array zu kopieren .
Ebenso funktioniert das Schreiben einer Funktion, die eine Struktur akzeptiert, nicht, da Argumente in Funktionsaufrufen wiederum nach Wert kopiert werden und das, was Sie erhalten, wahrscheinlich nur das erste Element Ihres Arrays ist data
.
Dies macht es nicht zu einer schlechten Idee, aber Sie müssen bedenken, diese Strukturen immer dynamisch zuzuweisen und sie nur als Zeiger weiterzugeben.