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
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
13940800cookie-checkErgebnis von ‘sizeof’ in einem Array von Strukturen in C?yes
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