Ich muss eine Funktion ohne Argumente erstellen, die ein Array zurückgibt
Ich bekomme den Fehler: "Warnung: Funktion gibt die Adresse der lokalen Variablen"
zurückMein Code wurde vereinfacht, um das Lesen zu erleichtern
%Vor%Ich bin davon überzeugt, dass der Zeiger verloren geht, wenn die Funktion endet, aber das Array noch gesendet wird? Wenn nicht, was ist eine gute Möglichkeit, dieses Integer-Array ohne Argumente im Funktionsaufruf zurückzugeben?
Schätzen Sie die Hilfe im Voraus!
Prost
Nein, das Array wird nicht gesendet. Sie müssen einen der folgenden Schritte ausführen:
In den meisten Fällen ist die letzte die bevorzugte Lösung.
Stellen Sie sich vor, Sie wüssten nicht, was C-Arrays sind und verbinden Sie die Welt von modernem C ++ :
%Vor% Wenn Ihr Compiler zu alt ist, um eine std::
oder std::tr1::
Implementierung von array<>
bereitzustellen, sollten Sie boost::array<>
stattdessen. Oder erwägen Sie die Verwendung von std::vector<>
in beide Richtungen.
Ich bin davon überzeugt, dass der Zeiger verloren geht, wenn die Funktion endet, aber das Array noch gesendet wird?
Das Verhalten ist nicht definiert.
%Vor%Was ist eine gute Möglichkeit, dieses Integer-Array ohne Argumente im Funktionsaufruf zurückzugeben?
num
ist eine lokale Variable, die sich auf dem Stack befindet. Sie können die Referenz einer lokalen Variablen nicht zurückgeben. Stattdessen alloc nums
mit dem Operator new
zuweisen und an delete[]
it erinnern.
Wenn eine Funktion beendet wird, werden alle lokalen Variablen, die in dieser Funktion erstellt wurden, gelöscht
Sie erstellen ein lokales Array für die Funktion und geben dann einen Zeiger auf das Array zurück. Der zurückgegebene Zeiger zeigt auf einen Speicherort, der vom Betriebssystem bereits zurückgerufen wurde. So funktioniert es nicht für dich.
Anstelle von Arrays sollten Sie Vektoren verwenden, da es sich um C ++
Sie können in C ++ kein einfaches Array zurückgeben. Probieren Sie
aus %Vor% Nun ist nums
ein Zeiger auf ein Heap-Array, das nach der Rückkehr von getNums
weiterlebt.
Ihr Array ist eine reguläre stackbasierte lokale Variable. Das bedeutet, dass es verschwindet, wenn Sie von der Funktion zurückkehren und ein Zeiger darauf nicht funktioniert. Sie müssen das Array länger leben lassen, indem Sie es in eine statische Variable umwandeln oder es auf dem Heap zuweisen:
%Vor%Beide Lösungen haben Auswirkungen, die Sie verstehen sollten, bevor Sie eine verwenden. Die statische Zuweisung (erste Option) ist nämlich heutzutage hauptsächlich eine Kuriosität, da sie eine Art globale Variable erzeugt und mehr Probleme verursacht als sie löst. Das Heap-Allocated-Array ist recht häufig, aber es ist üblicher, den Pointer mit einem Argument zu füllen, um die Schnittstelle expliziter zu machen. In jedem Fall ist der Aufrufer dafür verantwortlich, den belegten Speicher später freizugeben.
Und wie andere bemerken, gibt es sogar bessere C ++ - spezifische Lösungen, wenn Sie nicht darauf bestehen, ein einfaches C-Array zu verwenden.