Wie bestimme ich die Größe meines Arrays in C?
Das heißt, die Anzahl der Elemente, die das Array aufnehmen kann?
Wie bestimme ich die Größe meines Arrays in C?
Das heißt, die Anzahl der Elemente, die das Array aufnehmen kann?
Neben den bereits gegebenen Antworten möchte ich noch auf einen Sonderfall hinweisen, bei dem die Verwendung von
sizeof(a) / sizeof (a[0])
Wenn a
ist entweder ein Array aus char
, unsigned char
o signed char
brauchen Sie nicht zu verwenden sizeof
zweimal seit einer sizeof
Ausdrücke mit einem Operanden dieser Typen führen immer zu 1
.
Zitat aus C18,6.5.3.4/4:
" Cuando
sizeof
auf einen Operanden mit dem Typchar
,unsigned char
, odersigned char
(oder eine qualifizierte Version davon) ist das Ergebnis1
."
So, sizeof(a) / sizeof (a[0])
wäre gleichbedeutend mit NUMBER OF ARRAY ELEMENTS / 1
si a
ist ein Array des Typs char
, unsigned char
o signed char
. Die Division durch 1 ist überflüssig.
In diesem Fall können Sie einfach abkürzen und tun:
sizeof(a)
Zum Beispiel:
char a[10];
size_t length = sizeof(a);
Wenn Sie einen Beweis wünschen, hier ist ein Link zu GodBolt .
Nichtsdestotrotz bleibt die Sicherheit erhalten, wenn sich der Typ wesentlich ändert (obwohl diese Fälle selten sind).
Wahrscheinlich ziehen Sie es vor, weiterhin ein Makro mit der Division anzuwenden, weil sich der Typ in der Zukunft ändern kann (auch wenn das vielleicht unwahrscheinlich ist), und die Division zur Kompilierzeit bekannt ist, so dass der Compiler sie wegoptimieren wird (wenn das nicht der Fall ist, wechseln Sie bitte Ihren Compiler).
@CacahueteFrito Ja, daran habe ich in der Zwischenzeit auch gedacht. Ich habe es als Randnotiz in die Antwort aufgenommen. Vielen Dank dafür.
Ich würde Ihnen raten, niemals so hinterhältig zu sein. Es bringt nicht einmal Leistungsverbesserungen mit sich, da die Aufteilung zur Kompilierzeit vorgenommen wird.
Dies ist ein technisch undefiniertes Verhalten; die *
Operator darf nicht auf einen Zeiger angewendet werden, der das Ende überschritten hat
"undefiniertes Verhalten" bedeutet, dass der C-Standard das Verhalten nicht definiert. Wenn Sie es in Ihrem Programm ausprobieren, kann alles passieren
@M.M wollen Sie sagen *(&a+1) - a;
unterscheidet sich von (&a)[1] - a;
oben, nicht beide *(&a+1)
y (&a)[1]
als 1 nach dem Ende zählen?
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
6 Stimmen
Zur Typensicherheit siehe stackoverflow.com/questions/19452971/array-size-macro-that-rejects-pointers
0 Stimmen
Eine Antwort ist Gegenstand von eine Metafrage .
1 Stimmen
Wenn die Antworten keinen Sinn ergeben, denken Sie daran, dass beim Kompilieren von C in Assembler die Größeninformation des Arrays verloren geht. Wenn Sie etwas deklarieren wie
int foo[5];
dass 5 nirgendwo in Ihrer kompilierten ausführbaren Datei erscheint.