Verstehen der Diskrepanz in sizeof()-Werten für Arrays, die an Funktionen in C übergeben werden
In C können Arrays bei der Übergabe ein unerwartetes Verhalten zeigen zu Funktionen. Es stellt sich die Frage: Warum gibt der Operator sizeof() einen falschen Wert zurück, wenn ein Array an eine Funktion übergeben wird, während er vor dem Funktionsaufruf den richtigen Wert bereitstellt?
Um dies zu beheben, müssen wir verstehen, dass Arrays in C unterliegen einem Zeigerzerfall, wenn sie an Funktionen übergeben werden. Wenn ein Array übergeben wird, degeneriert es zu einem Zeiger, der auf das erste Element des Arrays zeigt. Folglich wertet die Verwendung von sizeof() für den Funktionsparameter die Größe des Zeigers anstelle des gesamten Arrays aus.
Ein typisches Beispiel finden Sie in der Frage:
#include <stdio.h> void test(int arr[]) { int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); printf("%d\n", arrSize); // 2 (wrong?!) } int main (int argc, const char * argv[]) { int point[3] = {50, 30, 12}; int arrSize = (int)(sizeof(point) / sizeof(point[0])); printf("%d\n", arrSize); // 3 (correct :-) ) test(point); return 0; }
In der Haupt( )-Funktion wird die korrekte Array-Größe bestimmt, indem die Größe des zugewiesenen Speichers (erhalten mit sizeof(point)) durch die Größe jedes Elements (sizeof(point[0])) dividiert wird. In der Funktion test() ist die berechnete Array-Größe jedoch falsch, da sizeof(arr) die Größe des Zeigers auf das Array und nicht das Array selbst zurückgibt.
Um dieses Problem zu beheben und die Funktion zuzulassen Um die Größe des Arrays zu bestimmen, sollte diese als separater Parameter übergeben werden:
void test(int arr[], size_t elems) { /* ... */ } int main(int argc, const char * argv[]) { int point[3] = {50, 30, 12}; /* ... */ test(point, sizeof(point)/sizeof(point[0])); /* ... */ }
Es ist wichtig zu beachten, dass der Trick „sizeof(point)/sizeof(point[0])“ nur für zugewiesene Arrays funktioniert auf dem Stapel. Bei dynamisch zugewiesenen Arrays wird ein falsches Ergebnis zurückgegeben, da die Größe des Arrays nicht mit dem Zeiger gespeichert wird.
Das obige ist der detaillierte Inhalt vonWarum gibt „sizeof()' bei der Übergabe an C-Funktionen falsche Array-Größen zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!