Heim >Backend-Entwicklung >C++ >Warum verhält sich sizeof() anders, wenn Arrays an Funktionen in C übergeben werden?

Warum verhält sich sizeof() anders, wenn Arrays an Funktionen in C übergeben werden?

Barbara Streisand
Barbara StreisandOriginal
2024-11-11 17:56:031055Durchsuche

Why Does sizeof() Behave Differently When Passing Arrays to Functions in C  ?

sizeof()-Anomalie bei der Übergabe von Arrays an Funktionen in C

In C verhält sich der sizeof()-Operator anders, wenn es um Arrays geht an Funktionen übergeben werden, als wenn sie in der Hauptfunktion verwendet werden. Diese Diskrepanz kann für Anfänger verwirrend sein.

Richtige Array-Übergabe

Um ein Array ordnungsgemäß an eine Funktion zu übergeben, ist es wichtig, es als Referenz zu übergeben Syntax:

int length_of_array(int (&arr)[N]);

Wobei:

  • arr ist das Array, das an die Funktion übergeben wird.
  • N ist eine ganzzahlige Konstante, die darstellt die Größe des Arrays.

Verwenden von Sizeof() in Funktionen

Bei Verwendung von sizeof() innerhalb der Funktion gilt Folgendes:

sizeof(arr) == N * sizeof(int);

Erklärung:

  • sizeof(arr) gibt die gesamte dem Array zugewiesene Speichergröße zurück, die N-mal so groß ist wie die Größe jedes Elements (sizeof(int)).

Problem mit falscher Array-Übergabe

Im bereitgestellten Codeausschnitt übergibt die Funktion length_of_array() versehentlich das Array per Zeiger , etwa so:

int length_of_array(int some_list[]);

Diese falsche Übergabemethode führt zu Folgendem Problem:

  • sizeof(some_list) gibt die Größe des Zeigers auf das erste Element im Array zurück.
  • sizeof(*some_list) gibt die Größe eines einzelnen Elements zurück im Array.
  • Die Division dieser Werte ergibt immer 1, unabhängig vom tatsächlichen Array Größe.

Problemumgehung mithilfe von Vorlagen

Um diese Einschränkung zu überwinden, kann man einen vorlagenbasierten Ansatz wie diesen verwenden:

template<size_t N>
int length_of_array(int (&amp;arr)[N])
{
    std::cout << N << std::endl; // Will output the correct array size
    return N;
}

Wichtiger Punkt:

Der wesentliche Unterschied zwischen den beiden Methoden besteht in der Übergabe von Arrays als Referenz und nicht in der Weitergabe Zeiger. Ersteres behält das Wissen über die Größe des Arrays bei, letzteres jedoch nicht.

Das obige ist der detaillierte Inhalt vonWarum verhält sich sizeof() anders, wenn Arrays an Funktionen in C übergeben werden?. 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