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
Freigeben: 2024-11-11 17:56:03
Original
1053 Leute haben es durchsucht

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]);
Nach dem Login kopieren

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);
Nach dem Login kopieren

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[]);
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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!

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