Heim > Backend-Entwicklung > C++ > Warum gibt „sizeof()' unterschiedliche Werte für Arrays innerhalb und außerhalb einer Funktion in C zurück?

Warum gibt „sizeof()' unterschiedliche Werte für Arrays innerhalb und außerhalb einer Funktion in C zurück?

Barbara Streisand
Freigeben: 2024-12-21 18:35:09
Original
893 Leute haben es durchsucht

Why Does `sizeof()` Return Different Values for Arrays Inside and Outside a Function in C?

Warum die Übergabe eines Arrays an eine Funktion seinen sizeof()-Wert ändert

In der C-Programmierung kann die Übergabe eines Arrays an eine Funktion dazu führen unerwartetes Verhalten bezüglich seiner Größe beim Abrufen mit sizeof(). Diese Besonderheit ergibt sich aus dem Konzept des Array-Zerfalls.

Array-Zerfall erklärt

Wenn ein Array an eine Funktion übergeben wird, wird es implizit konvertiert oder „zerfällt“. ein Zeiger auf sein erstes Element. Diese Konvertierung verbirgt effektiv die wahre Größe des Arrays, da sizeof() jetzt auf den Zeiger und nicht auf das ursprüngliche Array wirkt.

Beispiel mit Code

Bedenken 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 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 diesem Beispiel werden zwei Aufrufe von sizeof() durchgeführt. Der erste Aufruf innerhalb der main()-Funktion gibt die Größe des Array-Punkts korrekt als 3 zurück. Der zweite Aufruf innerhalb der test()-Funktion gibt jedoch fälschlicherweise 2 zurück. Diese Ergebnisinkongruenz tritt auf, weil der Array-Punkt in einen Zeiger umgewandelt wurde, wenn es wurde an die Funktion übergeben.

Array-Zerfall überwinden

Um die wahre Größe eines Arrays bei der Übergabe an eine Funktion beizubehalten, muss man explizit an übergeben zusätzlicher Parameter zur Funktion, der die Größe angibt.

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

Durch die Übergabe der Größe als separaten Parameter kann die Funktion die wahre Größe des Arrays genau bestimmen und entsprechende Vorgänge ausführen.

Hinweis:

Der Trick sizeof(point)/sizeof(point[0]) zum Ermitteln der Array-Größe funktioniert möglicherweise nicht immer für dynamisch zugewiesene Arrays Arrays.

Das obige ist der detaillierte Inhalt vonWarum gibt „sizeof()' unterschiedliche Werte für Arrays innerhalb und außerhalb einer Funktion in C 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