Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Returnpointer gibt falsche Adresse zurück

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
06.12.2016, 09:48 Uhr
~bamf
Gast


Hallo,

ich habe ein Problem mit einer einfachen Funktion.
Diese bekommt von der main einen pointer auf eine Zeichenkette und eine int-Variable (Länge der Zeichenkette).
Sie soll dann irgendeine Operation ausführen und das Ergebnis in eine neue Kette schreiben.
Die Adresse der neuen Kette soll mittels pointer an die main zurückgegeben und dort dann angezeigt werden.

Leider habe ich immer unterschiedliche Adressen des pointers in der der Funktion und in der main, was ich mir nicht ansatzweise erklären kann. Wie kann ich sonst in der main das Ergebnis aus meiner Funktion verwenden und ausgeben?

Danke für eure Hinweise!


Code:
//  copy-Zeiger-Test

#include <iostream>

char* copy(char,int);

char* copy(char *pinput, int l)
{
    
    char output[25];
    char* poutput=&output[0];
    std::cout<<"Adresse &poutput Anfang (copy): "<<&poutput<<std::endl;
    
    for(int i=0;i<=l;i++)
        {
        output[i]=*pinput;
        pinput++;
        }
    std::cout<<"Adresse &poutput: Ende (copy): "<<&poutput<<std::endl;
    return poutput;
    
}



int main() {
    
    char einkette[25];
    int u=0;
    char* auskette;
    
    std::cout << "Bitte gebe eine Zeichenkette ein." << std::endl;
    
    std::cin >> einkette;
    
    //Lange berechnen
    while (einkette[u]!=0) {
        u++;
    }
    std::cout<<"Laenge der Kette: "<<u<<std::endl;
    
    auskette=copy(einkette, u);
    
    std::cout<<"Adresse &auskette (main): "<<&auskette<<std::endl;


    return 0;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.12.2016, 11:15 Uhr
ao

(Operator)


Du gibst einen Pointer auf eine lokale Variable zurück. Das funktioniert nicht, weil die Variable aufhört zu existieren, wenn die Funktion verlassen wird. Das ist ein gängiger Anfängerfehler, zu dem es viel Lesestoff im Internet gibt. Google mal nach "return pointer to local variable".

Es gibt mehrere Auswege:
1. in copy das Array output dynamisch anlegen (mit new) und per return rausreichen. Die main muss (!) den Speicher nach Verwendung freigeben (delete[]), sonst ist das ein Speicherleck. In trivialen Fällen wie hier ist das überschaubar, aber bei komplizierteren Programmen kann das Speichermanagement zum Problem werden, wenn man diese Technik zu oft und zu planlos einsetzt.

2. die main legt das Array an (lokal, statisch oder dynamisch, das entscheidet die main und ist für die copy-Funktion egal), reicht es in copy rein (über einen weiteren Parameter) und bekommt es gefüllt wieder raus. copy erzeugt keinen Speicher, sondern kopiert nur Daten. Das ist insofern sicherer, als derjenige, der die Daten haben will, den Speicher dafür bereitstellt und sich ggfs. um die adäquate Entsorgung kümmert.

3. Es gibt noch Smartpointer, aber das führt hier zu weit, das kannst du dir selber mal anlesen.

Dieser Post wurde am 06.12.2016 um 11:16 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.12.2016, 11:56 Uhr
Tommix



Zur Ergänzung:
Einen ausführlichen Artikel zu dem Thema gibt es hier:
https://ssl.secure-hosts.de/www.fun-soft.de/showtopic.php?threadid=1958
und zum Thema Smartpointer hier:
https://ssl.secure-hosts.de/www.fun-soft.de/showtopic.php?threadid=5442
(Warum in die Ferne schweifen...)

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.12.2016, 13:04 Uhr
~somebody
Gast


Aber in Wahrheit willst du das so nicht machen.
Benutze std::string.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.12.2016, 19:16 Uhr
~bamf
Gast



Zitat von ao:
Du gibst einen Pointer auf eine lokale Variable zurück. Das funktioniert nicht, weil die Variable aufhört zu existieren, wenn die Funktion verlassen wird. Das ist ein gängiger Anfängerfehler, zu dem es viel Lesestoff im Internet gibt. Google mal nach "return pointer to local variable".

Es gibt mehrere Auswege:
1. in copy das Array output dynamisch anlegen (mit new) und per return rausreichen. Die main muss (!) den Speicher nach Verwendung freigeben (delete[]), sonst ist das ein Speicherleck. In trivialen Fällen wie hier ist das überschaubar, aber bei komplizierteren Programmen kann das Speichermanagement zum Problem werden, wenn man diese Technik zu oft und zu planlos einsetzt.

2. die main legt das Array an (lokal, statisch oder dynamisch, das entscheidet die main und ist für die copy-Funktion egal), reicht es in copy rein (über einen weiteren Parameter) und bekommt es gefüllt wieder raus. copy erzeugt keinen Speicher, sondern kopiert nur Daten. Das ist insofern sicherer, als derjenige, der die Daten haben will, den Speicher dafür bereitstellt und sich ggfs. um die adäquate Entsorgung kümmert.

3. Es gibt noch Smartpointer, aber das führt hier zu weit, das kannst du dir selber mal anlesen.


Wunderbar! Ich habe ein paar Versuche gebraucht mit dem dynamischen Array, aber jetzt funktioniert alles wie es soll, vielen Dank dafür!
Variante 2 ist natürlich noch einfacher, aber die erste Variante gefällt mir deutlich besser.

Vielen Dank!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.12.2016, 19:17 Uhr
~bamf
Gast



Zitat von ~somebody:
Aber in Wahrheit willst du das so nicht machen.
Benutze std::string.


Darf ich leider nicht, da explizit char Arrays verlangt sind (über die Sinnhaftigkeit dieser Aufgaben lässt sich streiten...)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: