Ergebnis von ‘sizeof’ in einem Array von Strukturen in C?

Lesezeit: 2 Minuten

Benutzeravatar von Joseph Piché
Josef Piche

In C habe ich ein Array von Strukturen, die wie folgt definiert sind:

struct D
{
    char *a;
    char *b;
    char *c;
};

static struct D a[] = {
    {
        "1a",
        "1b",
        "1c"
    },
    {
        "2a",
        "2b",
        "2c"
    }
};

Ich möchte die Anzahl der Elemente im Array bestimmen, aber sizeof(a) gibt ein falsches Ergebnis zurück: 48, nicht 2. Mache ich etwas falsch oder mache ich etwas falsch? sizeof einfach unzuverlässig hier? Wenn es darauf ankommt, kompiliere ich mit GCC 4.4.

  • Siehe stackoverflow.com/questions/1598773/… für eine Antwort, die einige Hacks enthält, um die unten geposteten Techniken sicherer zu machen.

    – Michael Burr

    14. Dezember 2009 um 8:23 Uhr

sizeof gibt Ihnen die Größe in Bytes, nicht die Anzahl der Elemente. Wie Alok sagt, teilen Sie die Größe in Byte des Arrays durch die Größe in Byte eines Elements, um die Anzahl der Elemente zu erhalten. Das korrekte C-Idiom lautet:

sizeof a / sizeof a[0]

  • Eine alternative, ebenso idiomatische Version ist sizeof a / sizeof *a

    – Café

    14. Dezember 2009 um 2:47 Uhr

Benutzeravatar von Alok Singhal
Alok Singhal

sizeof a / sizeof a[0];

Dies ist eine Konstante zur Kompilierzeit, sodass Sie sie beispielsweise verwenden können, um ein weiteres Array zu erstellen:

#define N sizeof a / sizeof a[0]
int n_a[N];

  • Wenn sizeof(a) in diesem Fall 48 ist, wird sizeof(a[0]) == 24. Das bedeutet, dass jedes Zeichen * 8 Bytes belegt. sizeof(char *) ist wahrscheinlich entweder 4 oder 8, abhängig von 32-Bit/64-Bit, aber Compiler werden Strukturmitglieder wortausrichten, sodass jedes Element 8 Bytes benötigt.

    – jmanning2k

    22. Dezember 2009 um 20:24 Uhr

  • Ja, aber das Schöne ist, die Unterteilung gibt die richtige Größe an, ob es eine Polsterung gibt oder nicht, oder was auch immer die Größe der ist struct.

    – Alok Singhal

    22. Dezember 2009 um 23:34 Uhr

  • #define sollte am Ende kein Semikolon haben

    – Paamand

    26. Dezember 2015 um 9:48 Uhr

  • Beachten Sie, dass dies möglicherweise nicht funktioniert, wenn “a” als deklariert ist extern (obwohl es in der ursprünglichen Frage nicht der Fall ist). Der Compiler könnte die Größe von (a) zur Kompilierzeit nicht bestimmen, wenn sie in einer anderen Quelldatei deklariert ist.

    – Elomage

    29. Juni 2016 um 21:17 Uhr

  • Das Makro sollte in Klammern gesetzt werden

    – MM

    11. Mai 2021 um 20:58 Uhr

sizeof gibt die Speichergröße des übergebenen Elements zurück. Indem Sie die Größe eines Arrays durch die Größe eines einzelnen Elements teilen, erhalten Sie die Anzahl der Elemente.

Beachten Sie, dass die Elementgröße auch einige Füllbytes enthalten kann. Aus diesem Grund hat eine aufgefüllte Struktur (z. B. wenn auf ein char-Element ein Zeiger folgt) ein sizeof Wert größer als die Summe der Mitgliedergröße.

Lassen Sie sich andererseits nicht stören, wenn Sie Elemente in einem Array zählen: sizeof(a) / sizeof(a[0]) wird immer noch so reibungslos funktionieren wie erwartet.

ssize_t portfoySayisi = sizeof(*portfoyler);

DIESES FUNKTIONIERT

1394080cookie-checkErgebnis von ‘sizeof’ in einem Array von Strukturen in C?

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

Privacy policy