Warum hat ein C-Array einen falschen Wert für sizeof (), wenn es an eine function übergeben wird?

Vollständiges Beispiel:

#include  void test(int arr[]) { int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); printf("%d\n", arrSize); // 2 (wrong?!) } 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; } 

Bevor es an eine function übergeben wird, gibt sizeof den richtigen Wert an. Wenn Sie genau dasselbe auf dem gleichen Array in der function tun, erhalten Sie seltsame Ergebnisse. Es fehlt ein Element. Warum?

Wenn Sie ein Array in eine function in C übergeben, verfällt das Array in einen pointers auf sein erstes Element. Wenn Sie sizeof für den Parameter verwenden, nehmen Sie die Größe des pointerss und nicht das Array selbst an.

Wenn Sie die function benötigen, um die Größe des Arrays zu kennen, sollten Sie es als separaten Parameter übergeben:

 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])); /* ... */ } 

Beachten Sie auch, dass der sizeof sizeof(point)/sizeof(point[0]) aus einem ähnlichen Grund (die sizeof eines pointerss) nicht für ein dynamisch zugewiesenes Array funktioniert, sondern nur für ein Array, das auf dem Stack zugeordnet ist.

Weil das Array zu einem pointers zerfallen ist , wenn es als functionsargument übergeben wird, gibt Ihnen sizeof 4 und 8 für 32- bzw. 64-Bit-Plattformen.

Außerdem ist es wichtig zu verstehen, dass sizeof zur Kompilierzeit ausgewertet wird . Da dies der Fall ist, ist es nicht sinnvoll, eine andere Ausgabe in test() zu erwarten, abhängig davon, was übergeben wurde. Die sizeof Berechnung wurde beim Kompilieren der function durchgeführt.

Denn wenn es übergeben wird, wird nur der pointers auf das Array übergeben.

Ihre Frage wird auch in der C-Programmier-FAQ beantwortet. Frage 6.21.

Denn in C, C ++ und Objective-C können functionen keine Array-Parameter haben. Sie können nur Parameter haben, die wie Array-Parameter aussehen , aber das sind sie nicht . In Ihrem Beispiel

 void test(int arr[]) 

Der Compiler sieht “es gibt einen Parameter, der wie ein Array von int aussieht” und ersetzt diesen Parameter durch einen “pointers auf int”. Also ist die function, die du geschrieben hast, absolut hundertprozentig identisch

 void test (int* arr) 

Innerhalb der function sizeof (arr) erhalten Sie daher die Größe eines “pointer to int”.

Weil sizeof () nicht die Größe eines Arrays in C angibt. Es macht etwas völlig anderes.

sizeof C ++ – Referenz