Rückgabe des Integer-Arrays aus der Funktion ohne Argumente [duplizieren]

7

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ück

Mein 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

    
Alex 03.05.2011, 08:21
quelle

7 Antworten

7

Nein, das Array wird nicht gesendet. Sie müssen einen der folgenden Schritte ausführen:

  • Erstellen Sie das Array dynamisch mit new
  • Erstellen Sie das Array statisch
  • übergibt das Array als Zeiger an die Funktion
  • verwende std :: vector

In den meisten Fällen ist die letzte die bevorzugte Lösung.

    
Neil Butterworth 03.05.2011 08:24
quelle
5

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.

    
ildjarn 03.05.2011 08:36
quelle
3
  

Ich bin davon überzeugt, dass der Zeiger verloren geht, wenn die Funktion endet, aber das Array noch gesendet wird?

Das Verhalten ist nicht definiert.

  

Was ist eine gute Möglichkeit, dieses Integer-Array ohne Argumente im Funktionsaufruf zurückzugeben?

%Vor%

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.

%Vor%     
Mahesh 03.05.2011 08:23
quelle
2

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 ++

handelt     
Alok Save 03.05.2011 08:26
quelle
1

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.

    
Daniel Lubarov 03.05.2011 08:24
quelle
0
%Vor%

Es sollte jetzt eigentlich funktionieren:)

    
Fahad Uddin 03.05.2011 08:25
quelle
0

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.

    
zoul 03.05.2011 08:26
quelle

Tags und Links