Hello,
einen Zeiger auf ein Array kann ich nicht returnen?
Doch kannst Du. Aber Du musst dafür sorgen, dass das Array nach dem Ende der Funktion auch noch da ist. Das schrieb ich Dir schon in https://forum.selfhtml.org/?t=177894&m=1172341
Wie funktioniert das mit dem Funktionsaufruf?
Auf dem Stack wird Platz reserviert für
- Rückgabewert (Anzahl der Bytes nach Typ, denn der eigentliche Wert ist ja noch nicht bekannt)
- Aufrufparameter
- Register
- Return (far)-Befehl mit Anzahl der Bytes die später wieder entfernt werden müssen
Dann wird die Kontrolle (BP) an den Funktionskörper übergeben.
Wenn Du nun innerhalb dieser Funktion weitere Variablen aufmachst, werden die ebenfalls auf den Stack draufgepackt. Wenn die Funktion endet, wird der Stack wieder bereinigt, oder genauer gesagt, der Stackpointer wieder auf den Wert vor dem Funktionsaufruf zurückgesetzt. Dein Array liegt zwar nun noch auf dem Stack, aber außerhalb des referenzierten Bereiches, also im nächsten Moment vermutlich schon innerhalb des Arbeitsbreiches der nächsten aufgerufenen Funktion.
Nur der Rückgabewert, und das war ja nur ein Zeiger auf das Array, bleibt der Parent-Funktion auf dem Stack solange erhalten, bis sie ihn abgeholt hat.
Wenn Du nun über diesen Zeiger auf das Array zugrifen willst, greifst Du in den Stack hinein, an eine Stelle, von der Du nicht weißt, welchem Programmteil dieser inzwischen zugeordnet ist.
Daher musst Du Dir den Speicher mit malloc() oder mit new oser sonstigen Methoden auf dem Heap beschaffen. Dort bleibt er solange für den zeiger erhalten, bis er mit delete, dispose, free oder wie der Rückgabebefehl sonst auch immer heißt, wieder freigegeben wird. Deshalb darf dir der Zeiger auf den allokierten Speicher auch nicht verloren gehen, weil dieser gleichzeitig der Key für den Eintrag in der Speicherverwaltung ist. Diese weiß, wieviel Speicher zu welchem Zeiger allokiert wurde.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg