Heim >Backend-Entwicklung >C++ >Warum gibt „sizeof' unterschiedliche Array-Größen innerhalb und außerhalb einer C-Funktion an?

Warum gibt „sizeof' unterschiedliche Array-Größen innerhalb und außerhalb einer C-Funktion an?

Susan Sarandon
Susan SarandonOriginal
2024-12-19 10:51:09853Durchsuche

Why Does `sizeof` Give Different Array Sizes Inside and Outside a C Function?

Warum die Berechnung der Array-Größe innerhalb einer Funktion in C unterschiedlich ist

Bei der Übergabe eines Arrays an eine Funktion zerfällt C das Array automatisch in einen Zeiger zu seinem ersten Element. Dieser Zeiger trägt die Adresse des ersten Array-Elements, aber nicht seine Größe.

Betrachten Sie dieses Beispiel:

#include <stdio.h>

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

int main() {
    int point[3] = {50, 30, 12};

    int arrSize = (int)(sizeof(point) / sizeof(point[0])); // Correct
    printf("%d\n", arrSize); // Prints 3

    test(point);

    return 0;
}

In main gibt sizeof(point) korrekt die Größe des gesamten Arrays an ( 12 Byte). Allerdings ergibt sizeof(arr) im Test 4 Bytes (die Größe eines ganzzahligen Zeigers), was zu einer falschen Berechnung der Array-Größe führt (ein Element fehlt).

Um dieses Problem zu beheben, muss die Array-Größe explizit angegeben werden als separater Parameter übergeben:

void test(int arr[], size_t elems) {
    int arrSize = elems;
    /* ... */
}

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

Beachten Sie, dass sizeof(point)/sizeof(point[0]) für stapelzugewiesene Arrays funktioniert, aber nicht für dynamisch zugewiesene Arrays, da dies der Fall ist beruht auf dem zugrunde liegenden Zerfallsmechanismus.

Das obige ist der detaillierte Inhalt vonWarum gibt „sizeof' unterschiedliche Array-Größen innerhalb und außerhalb einer C-Funktion an?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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