HOWTO · C
Wie Sie die Größe des Arrays in C erhalten
Dieses Tutorial stellt Methoden in C vor, um die Größe eines Arrays zu bestimmen. Lernen Sie, den sizeof()-Operator effektiv zu verwenden, und erkunden Sie alternative Methoden wie Makros und Funktionen. Diese Techniken zu beherrschen ist für ein effizientes Speichermanagement und den Umgang mit Arrays in der C-Programmierung unerlässlich.
Auf dieser Seite
Teilen Sie bei einem Array fester Größe im selben Gültigkeitsbereich seine Gesamtgröße in Bytes durch die Größe eines Elements in Bytes: sizeof array / sizeof array[0]. Das Ergebnis ist die Anzahl der Elemente. Übergeben Sie diese Anzahl innerhalb einer Funktion separat, weil ein Array-Parameter als Zeiger behandelt wird.
Mit sizeof die Elemente eines Arrays fester Größe zählen
sizeof gibt eine Größe in Bytes zurück. Für ein im aktuellen Gültigkeitsbereich sichtbares Array ist sizeof values die Größe des gesamten Arrays, während sizeof values[0] die Größe eines Elements ist. Ihr Quotient ergibt die Elementanzahl, ohne dass eine bestimmte Byte-Größe für einen int angenommen werden muss.
Dieses vollständige C-Beispiel zählt ein Array fester Größe und übergibt das Ergebnis an eine Funktion. Die Werte und der Funktionsaufruf zeigen, wie sich das Muster auf einen anderen Elementtyp oder ein anderes Array übertragen lässt.
#include <stdio.h>
#include <stddef.h>
void print_values(const int *values, size_t count)
{
size_t i;
printf("Element count: %d\n", (int)count);
for (i = 0; i < count; ++i) {
printf("%d ", values[i]);
}
putchar('\n');
}
int main(void)
{
int values[] = {4, 8, 15, 16};
size_t count = sizeof values / sizeof values[0];
printf("Array count: %d\n", (int)count);
print_values(values, count);
return 0;
}
Array count: 4
Element count: 4
4 8 15 16
Für diese Demonstration ist die Umwandlung in int sicher, weil das Array vier Elemente hat. Verwenden Sie für eine allgemeine Zählung einen Formatbezeichner, der für size_t in der Ziel-C-Bibliothek geeignet ist.
Warum sizeof innerhalb einer Funktion die Zeigergröße liefert
In einer Funktionsparameterdeklaration wird int values[] zu int *values angepasst. Daher misst sizeof values in dieser Funktion den Zeiger, nicht das Array des Aufrufers. Teilt man diesen Wert durch sizeof values[0], erhält man die ursprüngliche Elementanzahl nicht zurück, und die Zeigergröße kann je nach Plattform variieren.
Behalten Sie die Berechnung der Array-Anzahl in dem Gültigkeitsbereich, in dem das Array deklariert ist, und übergeben Sie die Anzahl dann an jede Funktion, die sie benötigt. Das gilt für gewöhnliche Array-Parameter ebenso wie für Parameter in Zeigerschreibweise.
Ein Makro für Arrays im selben Gültigkeitsbereich verwenden
Ein Makro kann die Berechnung im selben Gültigkeitsbereich wiederverwendbar machen: #define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])). Verwenden Sie es dort, wo array ein tatsächliches Array ist, etwa ARRAY_SIZE(values) in dem Gültigkeitsbereich, der values deklariert. Wenn ein Array an eine Funktion übergeben wird, sieht das Makro einen Zeiger und kann die ursprüngliche Array-Länge nicht bestimmen. Bei mehrdimensionalen Arrays zählt der Ausdruck die Elemente der äußeren Dimension.
Die Elementanzahl an eine Funktion übergeben
Deklarieren Sie den Funktionsparameter als Zeiger (oder Array-Parameter) und geben Sie eine separate Anzahl vom Typ size_t an, wie es oben print_values(values, count) tut. Der Aufrufer berechnet die Anzahl, solange das vollständige Array im Gültigkeitsbereich ist; die Funktion verwendet diese Anzahl als Schleifengrenze. Dieses Muster funktioniert für Arrays fester Größe und dynamisch zugewiesenen Speicher, solange der Aufrufer die Anzahl der Elemente liefert. Halten Sie Zeiger und Anzahl zusammen, damit die Funktion genau die vorgesehenen Elemente verarbeiten kann.