Der Typ int[]
existiert eigentlich nicht.
Wenn Sie ein Array wie folgt definieren und initialisieren:
int a[] = {1,2,3};
dann zählt der Compiler die Elemente im Initialisierer und erstellt ein Array der richtigen Größe; in diesem Fall wird es magischerweise zu:
int a[3] = {1,2,3};
int[]
, wenn es als Parameter an eine Funktion übergeben wird, ist einfach nur int *
, also ein Zeiger auf das erste Element des Arrays. Es wird keine weitere Information damit übertragen, insbesondere nicht über die Größe. Das Gleiche gilt, wenn Sie einen Zeiger zurückgeben
Beachten Sie, dass ein Array kein Zeiger ist: Ein Zeiger kann so geändert werden, dass er auf andere Dinge zeigt, während ein Array immer auf denselben Speicher verweist; Ein Zeiger weiß nicht, wie groß der Speicherplatz ist, auf den er zeigt, während die Größe eines Arrays immer zur Kompilierzeit bekannt ist. Die Verwirrung entsteht daraus, dass ein Array in vielen Situationen zu einem Zeiger auf sein erstes Element zerfällt, und das an eine Funktion übergeben/aus einer Funktion zurückgegeben wird.
Warum funktioniert Ihr Code also nicht? Es gibt zwei große Fehler:
-
Sie versuchen, ein Array mit einem Zeiger zu initialisieren. Wir haben gesagt, dass ein int *
keine Informationen über die Größe des Arrays enthält. Es ist nur ein Zeiger auf das erste Element. Der Compiler kann also nicht wissen, wie groß a
gemacht werden sollte, um das von f()
zurückgegebene Zeug aufzunehmen.
-
In f
geben Sie einen Zeiger auf eine Variable zurück, die lokal für diese Funktion ist. Das ist falsch, weil ein Zeiger die Daten tatsächlich nicht speichert, er zeigt nur darauf, wo die Daten gespeichert sind, also in Ihrem Fall auf das in f
lokale a
. Da dieses Array lokal für die Funktion ist, hört es auf zu existieren, wenn die Funktion verlassen wird (also beim return
).
Dies bedeutet, dass der von Ihnen zurückgegebene Zeiger auf Dinge zeigt, die nicht mehr existieren; betrachten Sie den Code:
int * a = f();
Diese Initialisierung funktioniert, und Sie können versuchen, a
später in der Funktion zu verwenden, aber a
wird auf das nicht mehr existierende Array von f
zeigen; im besten Fall wird Ihr Programm abstürzen (und Ihnen sofort auffallen, dass Sie etwas falsch gemacht haben), im schlimmsten Fall wird es eine Weile zu funktionieren scheinen und dann seltsame Ergebnisse liefern.