Was ist der Zweck eines Arrays der Länge Null in einer Struktur? [duplicate]

Lesezeit: 2 Minuten

Wenn ich nach dem Linux-Kernel-Code suche, habe ich den folgenden Code gefunden:

   struct thread_info {
    struct task_struct  *task;
    struct exec_domain  *exec_domain;
    unsigned long       flags;
    __u32           status;
    __u32           cpu;
    int         preempt_count;
    mm_segment_t        addr_limit;
    struct restart_block    restart_block;
    void __user     *sysenter_return;
    unsigned long           previous_esp;
    __u8            supervisor_stack[0];
};

Beachten Sie, dass die letzte Variable “supervisor_stack” ein Array der Länge Null ist. Wozu dient es? Danke im Voraus!

  • Ich denke, das bedeutet ein Array der Länge Null, ich denke, es bedeutet, dass der erste Wert des Arrays abgerufen oder abgerufen wird.

    – Ryan Fung

    31. Juli 2012 um 5:58 Uhr

  • gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

    – Neo

    31. Juli 2012 um 5:59 Uhr

Benutzeravatar von Daniel Fischer
Daniel Fischer

Es ist die Pre-C99-Version eines flexiblen Array-Mitglieds, das von GCC als Erweiterung angeboten wird.

Der C99-Weg besteht darin, das flexible Array-Mitglied mit leeren Klammern zu definieren,

__u8  supervisor_stack[];

Es wird verwendet, um Daten zu speichern, deren Menge nicht konstant an die Struktur angrenzt. Der Speicher wird im Formular zugewiesen

struct foo *ptr = malloc(sizeof *ptr + whatever_is_needed);

In Absatz 18 von 6.7.2.1 beschreibt die Norm (Entwurf N1570) sie:

Als Sonderfall kann das letzte Element einer Struktur mit mehr als einem benannten Element einen unvollständigen Array-Typ haben; Dies wird als flexibles Array-Member bezeichnet. In den meisten Situationen wird das flexible Arraymitglied ignoriert. Insbesondere ist die Größe der Struktur so, als ob das flexible Anordnungselement weggelassen worden wäre, außer dass es mehr nachlaufende Polsterung aufweisen kann, als das Weglassen implizieren würde. Wenn jedoch a . (oder ->) Operator einen linken Operanden hat, der (ein Zeiger auf) eine Struktur mit einem flexiblen Array-Mitglied ist, und der rechte Operand dieses Mitglied benennt, verhält er sich so, als ob dieses Mitglied durch das längste Array (mit demselben Elementtyp) ersetzt würde, das dies nicht tun würde die Struktur größer machen als das Objekt, auf das zugegriffen wird; der Versatz des Arrays muss der des flexiblen Array-Elements bleiben, auch wenn dieser von dem des Ersatz-Arrays abweichen würde. Wenn dieses Array keine Elemente hätte, verhält es sich so, als hätte es ein Element, aber das Verhalten ist undefiniert, wenn versucht wird, auf dieses Element zuzugreifen oder einen Zeiger darüber hinaus zu generieren.

Es ist ein gängiger C-Hack, ein Array mit variabler Länge zu deklarieren (wobei Sie die Größe zum Zeitpunkt der Zuweisung definieren

Beispiel:

struct line {
   int length;
   char contents[0];
 };

 struct line *thisline = (struct line *)
   malloc (sizeof (struct line) + this_length);
 thisline->length = this_length;

Auf diese Weise haben Sie eine Strukturdefinition Ihrer Daten, die auch die Array-Länge für offensichtliche Bequemlichkeitszwecke speichert, aber Sie sind nicht durch die feste Größe eingeschränkt, die normalerweise mit einer Struktur verbunden ist

Beispiel entnommen aus hier (da sind auch mehr Infos drin)

1406670cookie-checkWas ist der Zweck eines Arrays der Länge Null in einer Struktur? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy