Zeiger als Rückgabewert geht nicht...

toothpick192

Grünschnabel
Hallo,
da ich Uni-bedingt mich mit C/C++ beschäftigen muss, habe ich versucht mir das ganze in den Kopf zu hämmern... Geht eigentlich alles auch ganz gut - bis auf die Zeiger-Problematik.(denke, dass geht vielen Anfängern so)

Obwohl ich meine diese ganze Zeigersache verstanden zu haben, geben mir Zeiger auf "Strings" immer noch Kopfschmerzen...

Als Beispiel folgender Code:
Code:
const char* toWin(const char* in){
       
       int i = strlen(in);
       bool first = true;
       int l = 0;
     
       char res[i+1];
       char* out = res;
      
       while(*in !='\0'){
                 if(*in=='/' && first){
                             *out='C';
                             *out++;
                             *out=':';
                             *out++;
                             *out='\\';
                             *out++;
                             first=false;
                             }
                 else if(*in=='/'){
                   *out='\\';
                   *out++; 
                   }
                 else{
                    *out=*in;
                    *out++;
                    }
                 *in++;
                 
                 }            
       *out='\0';
       
       out = res;
       puts(out);
       return out;
       }
int main(void)
{
const char* test = "/bin/ReadMe.txt";
puts(toWin(test));

getc(stdin);
}

Hier soll ein C-String an die Funktion toWin übergeben werden, der den "Linux" Pfad in einen "Windows" Pfad ändert und als Rückgabewert einen Zeiger auf den umgeänderten String liefert.
Die Logik mag nicht sonderlich elegant sein, aber es funktioniert. Wenn man den "out" Zeiger mit puts() in der toWin Methode ausgibt, bekommt man tatsächlich das erwartete Ergebnis.

Allerdings in der Ausgabe der main Methode bekomme ich nur noch Speichermüll. Ich habe mittlerweile alles mir erdenkliche ausprobiert und komme aber auf keine Lösung. Kann mir jemand auf die Sprünge helfen ?

Danke im Voraus,
Christian
 
Hallo,

Allerdings in der Ausgabe der main Methode bekomme ich nur noch Speichermüll. Ich habe mittlerweile alles mir erdenkliche ausprobiert und komme aber auf keine Lösung. Kann mir jemand auf die Sprünge helfen ?
Lokale Variablen landen immer auf dem Stack, deswegen ist der Inhalt von res nach dem Verlassen der Funktion nicht mehr verfügbar. Du müsstest also z.B. in der Funktion einen Speicherbereich auf dem Heap reservieren und einen Zeiger darauf zurückgeben.

Grüße,
Matthias
 
Vielen Dank erstmal für die schnelle Antwort. Verstehe ich sogar ( naja fast...) ;)

ist dies dann so ein Fall von einem "dangling pointer" von dem der Prof immer spricht ?

Achso, ich müsste also etwas in der Art von char* out = new char[20] machen oder so um Speicherplatz auf dem Heap zu reservieren, oder ?


Christian
 
ist dies dann so ein Fall von einem "dangling pointer" von dem der Prof immer spricht ?
Genau.

Achso, ich müsste also etwas in der Art von char* out = new char[20] machen oder so um Speicherplatz auf dem Heap zu reservieren, oder ?
Richtig. Allerdings solltest du aufpassen, auch wirklich genügend Speicher zu reservieren. Die i+1 Bytes in deinem Code wären auf jeden Fall zu wenig.

Grüße,
Matthias
 
Zurück