Heim > Backend-Entwicklung > C++ > Warum gibt „sizeof()' bei der Übergabe an C-Funktionen falsche Array-Größen zurück?

Warum gibt „sizeof()' bei der Übergabe an C-Funktionen falsche Array-Größen zurück?

Patricia Arquette
Freigeben: 2025-01-01 10:41:11
Original
186 Leute haben es durchsucht

Why Does `sizeof()` Return Incorrect Array Sizes When Passed to C Functions?

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;
}
Nach dem Login kopieren

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]));
   /* ... */
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage