Heim > Backend-Entwicklung > C++ > Warum gibt „sizeof' eine falsche Array-Größe zurück, wenn ein Array an eine C-Funktion übergeben wird?

Warum gibt „sizeof' eine falsche Array-Größe zurück, wenn ein Array an eine C-Funktion übergeben wird?

Linda Hamilton
Freigeben: 2024-12-14 15:35:16
Original
859 Leute haben es durchsucht

Why Does `sizeof` Return an Incorrect Array Size When Passing an Array to a C Function?

Array-Größendiskrepanz bei Übergabe an Funktion

Der sizeof()-Operator meldet einen ungenauen Wert für ein Array, wenn er an eine Funktion übergeben wird. Betrachten Sie den folgenden Codeausschnitt:

#include <stdio.h>

void test(int arr[]) {
    int arrSize = (int)(sizeof(arr) / sizeof(arr[0]));
    printf("%d\n", arrSize); // 2 (incorrect)
}

int main() {
    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

Beim Aufruf von main() gibt der Operator sizeof() die Größe des Arrays genau an, aber innerhalb der Funktion test() unterschätzt er die Größe um ein Element . Diese Ungleichheit entsteht, weil ein Array, wenn es an eine Funktion in C übergeben wird, in einen Zeiger zerfällt, der auf das erste Element des Arrays verweist. Folglich berechnet sizeof(arr) die Größe des Zeigers und nicht die Größe des zugrunde liegenden Arrays.

Um dieses Problem zu beheben, sollte die Größe des Arrays explizit als separater Parameter an die Funktion übergeben werden:

void test(int arr[], size_t elems) {
    // ...
}

int main() {
    int point[3] = {50, 30, 12};
    // ...
    test(point, sizeof(point) / sizeof(point[0]));
    // ...
}
Nach dem Login kopieren

Alternativ kann für dynamisch zugewiesene Arrays (hier nicht gezeigt) die Standard-C-Bibliotheksfunktion stdlib.h verwendet werden, um die Arrays genau abzurufen Größe.

Das obige ist der detaillierte Inhalt vonWarum gibt „sizeof' eine falsche Array-Größe zurück, wenn ein Array an eine C-Funktion übergeben wird?. 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