Heim >Backend-Entwicklung >C++ >Warum gibt „sizeof()' unerwartete Ergebnisse für Array-Parameter in C-Funktionen zurück?

Warum gibt „sizeof()' unerwartete Ergebnisse für Array-Parameter in C-Funktionen zurück?

Susan Sarandon
Susan SarandonOriginal
2024-11-11 07:31:02381Durchsuche

Why Does `sizeof()` Return Unexpected Results for Array Parameters in C   Functions?

Warum sizeof() für Array-Parameter in C-Funktionen nicht gleich funktioniert

In C zerfallen Arrays in Zeiger, wenn sie an sie übergeben werden Funktionen, wodurch die Verwendung von sizeof() zur Bestimmung der Array-Größe unzuverlässig wird. Um dies zu verstehen, analysieren wir die folgende Funktion:

int length_of_array(int some_list[])
{
    return sizeof(some_list) / sizeof(*some_list);
}

Problem mit dem Array-Parameter

Der Parameter some_list ist als Array deklariert, die Funktionssignatur jedoch schon entspricht effektiv int length_of_array(int* some_list). Dies liegt daran, dass Arrays in Funktionsparametern in Zeiger zerfallen.

Auswirkung auf sizeof()

Die Verwendung von sizeof(some_list) in diesem Kontext berechnet die Größe des Zeigers, was zu einem Ergebnis führt in einem Wert von 1. Die Division durch sizeof(*some_list) (die Größe einer Ganzzahl) ergibt 1.

Beispiel

Obwohl das Array num_list 15 Elemente enthält, gibt die Funktion length_of_array() im gegebenen Beispiel durchweg 1 zurück, wie in der Ausgabe zu sehen ist:

This is the output from direct coding in the
int main function:
15
This is the length of the array determined
by the length_of_array function:
1

Lösung mit Vorlage Funktionen

Um die Array-Größe in Funktionen zu bestimmen, kann man Vorlagenfunktionen verwenden und das Array als Referenz übergeben:

template<size_t N>
int length_of_array(int (&amp;arr)[N])
{
    return N;
}

In diesem Fall erfasst der Vorlagenparameter N die bekannte Größe des Arrays, sodass sizeof() den korrekten Wert zurückgeben kann.

Das obige ist der detaillierte Inhalt vonWarum gibt „sizeof()' unerwartete Ergebnisse für Array-Parameter in C-Funktionen zurück?. 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