C Struct-Array-Member ohne spezifische Länge

Lesezeit: 2 Minuten

Benutzer-Avatar
FaceBro

Ich bin auf dieses Stück Code gestoßen:

struct test                   
{                                        
 uint32       num_fields;            
 char array_field [];               
}; 

Wie kann ich verstehen array_field? Ist dies eine gcc-Erweiterung für die C-Sprache?

  • Bitte machen Sie das Update rückgängig und posten Sie eine neue Frage.

    – undur_gongor

    19. Juni 2013 um 8:49 Uhr

  • Danke für deinen Rat.

    – FaceBro

    20. Juni 2013 um 1:13 Uhr

Benutzer-Avatar
PP

Es ist ein C99-Feature namens flexibles Array-Mitglied Dies wird normalerweise verwendet, um ein Array mit variabler Länge zu erstellen.

Es kann nur als letztes Mitglied von a angegeben werden Struktur ohne Angabe der Größe (wie in array_field [];).


Beispielsweise können Sie Folgendes tun und das Mitglied arr werden 5 Bytes zugewiesen:

struct flexi_example
{
int data;
char arr[];
};


struct flexi_example *obj;

obj = malloc(sizeof (struct flexi_example) + 5);

Seine Vor- und Nachteile werden hier besprochen:

Flexible Array-Mitglieder in C – schlecht?

  • Irgendeine Idee, warum dies zu C hinzugefügt wurde, anstatt nur Zeiger zu verwenden? Ich sehe kaum ein, warum Arrays überhaupt verwendet werden sollten, außer um einen bestimmten Speicherplatz auf dem Stapel zuzuweisen. Das bringt Ihnen diesen Vorteil nicht.

    – xaxxon

    19. Juni 2013 um 8:03 Uhr

  • Ich habe endlich den Punkt, als ich die Größe der Struktur drucke. Eigentlich belegt das array_field keine Bytes, es ist dasselbe wie array_field[0]die verwendet wird, um ein Array mit variabler Länge in gcc zu erstellen.

    – FaceBro

    19. Juni 2013 um 8:06 Uhr

  • @xaxxon Es wurde hinzugefügt, weil Sie mit dieser Funktion echte VLAs haben können Innerhalb eine Struktur, und Sie müssen den Speicher nicht neu zuweisen zweimal. Dies erhöht die Lesbarkeit und verringert die Speicherfragmentierung und die Anzahl der Zeigerdurchläufe (und erhöht so möglicherweise die Leistung ein wenig).

    Benutzer529758

    19. Juni 2013 um 8:50 Uhr

  • @H2CO3: Flexible Array-Mitglieder sind keine VLAs. Im Speziellen, sizeof angewendet auf die Struktur enthält nicht die Größe des Array-Mitglieds; das musst du nur selbst im Auge behalten.

    – Keith Thompson

    24. Juni 2013 um 16:35 Uhr

  • Das flexible Array-Member wurde hinzugefügt, um das lange Bestehende zu formalisieren und stützte sich auf “struct hack” (diese Suche ist wirklich nicht vollständig, da einige Instanzen weggelassen werden, aber ohne die Anführungszeichen schleicht sich eine Menge Müll ein).

    – dmckee — Ex-Moderator-Kätzchen

    8. November 2013 um 2:53 Uhr


Benutzer-Avatar
Medinoc

Solche Strukturen werden normalerweise auf dem Heap mit einer berechneten Größe zugewiesen, mit Code wie dem folgenden:

#include <stddef.h>

struct test * test_new(uint32 num_fields)
{
    size_t sizeBeforeArray = offsetof(struct test, array_field);
    size_t sizeOfArray = num_fields * sizeof(char);
    struct test * ret = malloc(sizeBeforeArray + sizeOfArray);
    if(NULL != ret)
    {
        ret->num_fields = num_fields;
    }
    return ret;
}

1334990cookie-checkC Struct-Array-Member ohne spezifische Länge

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

Privacy policy