Ihre Kollegen haben gelogen. (Wahrscheinlich nicht absichtlich, aber nicht böse auf sie oder irgendetwas.)
Dies ist ein flexibles Array-Mitglied, und in C99 wird als char bar[];
geschrieben, und in C89 wurde geschrieben als char bar[1];
, und die einige Compiler würde lass dich schreiben als char bar[0];
. Grundsätzlich verwenden Sie nur Zeiger auf die Struktur, und ordnen sie alle mit einer Menge von zusätzlichem Platz am Ende:
const size_t i = sizeof("Hello, world!");
struct foo *p = malloc(offsetof(struct foo, bar) + i);
memcpy(p->bar, "Hello, world!", i);
// initialize other members of p
printf("%s\n", p->bar);
Auf diese Weise p->bar
speichern eine Zeichenfolge, deren Größe nicht durch eine Array-Deklaration beschränkt, sondern was immer noch alles in der gleichen Zuordnung wie der Rest der struct
getan wird (anstatt dass das Mitglied eine char *
sein muss und zwei malloc
s und zwei free
s, um es einzurichten).
erklärt Ah jetzt verstehe ich. Auf diese Weise ist die Strukturinstanz in einem fortlaufenden Speicherbereich enthalten. Wenn Balken ein Zeiger wäre, würde er auf einen anderen Speicherabschnitt zeigen. So erlauben flexible Arrays, die Struktur beispielsweise mit einer einzigen Memcopy zu kopieren. Ich habe diese Struktur im Linux-Kernel gefunden und tatsächlich wird eine einzelne Memcopy verwendet, um vom Kernel-Space in den User-Space zu kopieren. – Emiliano
@happy_emi - Zusätzlich zu einem einzelnen 'memcpy' (was ein großes Plus ist) braucht es auch nur ein einziges' malloc' (was relativ teuer sein kann, vor allem, wenn es sich um ein Objekt handelt, aus dem man viele macht) . –
Natürlich. (Ich meinte übrigens copy_to_user, nicht memcpy. Nur für den Rekord.) – Emiliano