1407 Stimmen

Wie bestimme ich die Größe meines Arrays in C?

Wie bestimme ich die Größe meines Arrays in C?

Das heißt, die Anzahl der Elemente, die das Array aufnehmen kann?

6 Stimmen

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.

-2voto

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 Typ char , unsigned char , oder signed char (oder eine qualifizierte Version davon) ist das Ergebnis 1 ."

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).

2 Stimmen

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).

1 Stimmen

@CacahueteFrito Ja, daran habe ich in der Zwischenzeit auch gedacht. Ich habe es als Randnotiz in die Antwort aufgenommen. Vielen Dank dafür.

2 Stimmen

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.

-4voto

Pygirl Punkte 11724

Anmerkung: Dies kann zu einem undefinierten Verhalten führen, wie M.M. in seinem Kommentar schreibt.

int a[10];
int size = (*(&a+1)-a) ;

Für weitere Einzelheiten siehe aquí und auch aquí .

2 Stimmen

Dies ist ein technisch undefiniertes Verhalten; die * Operator darf nicht auf einen Zeiger angewendet werden, der das Ende überschritten hat

3 Stimmen

"undefiniertes Verhalten" bedeutet, dass der C-Standard das Verhalten nicht definiert. Wenn Sie es in Ihrem Programm ausprobieren, kann alles passieren

0 Stimmen

@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?

-5voto

Mano S Punkte 641

Für vordefiniertes Array:

 int a[]={1,2,3,4,5,6};

Berechnung der Anzahl der Elemente im Array:

 element _count =sizeof(a) / sizeof(a[0]);

2 Stimmen

Auf diese Frage gibt es bereits viele Antworten. Was fügt diese Antwort hinzu, was die akzeptierte Antwort nicht hat?

CodeJaeger.com

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.

Powered by:

X