# char* als Rückgabewerte Probleme



## Zel2491 (11. Dez 2014)

Nabend,

steh bei C auf'm Schlauch und komme nicht weiter...


```
int main ( void )
{
    char *original_path = getWorkspace();
 
    return EXIT_SUCCESS;

}
char* getWorkspace()
{
    char puffer[200];

    return getcwd(puffer, sizeof(puffer)) != NULL ? getcwd(puffer, sizeof(puffer)) : "unknown";

}
```

erzeugt eine total komische Ausgabe... lasse ich mir das Ergebnis der Funktion getcwd(...) IN der getWorkspace() anzeigen, gibt er mir den richtigen Workspace zurück, indem ich mich grad befinde.

Rufe ich dann allerdings in der main

```
printf("PATH: %s\n", original_path);
```

auf, so ist das Ergebnis Stückwerk...

Als Ergebnis gibt er mir n paar Zeichen zurück... wie z.B. Pfeil nach Unten, Weiblichkeitssymbol, Copyright... Als Symbol eben, je nach dem welche Eingabe ich getätigt hab...

Ich weiß, dass ich was mit den Zeigern verbocke... nur was genau? 

Ein bisschen Hilfe wäre nett...^^

Gruß Zel ;-)


----------



## Tucan (26. Dez 2014)

Es liegt an der Zeichenkodierung der Konsole, vermute ich mal. Dieses Problem gibt es in Java und in C...

Die Konsole hat zwar eine 8-Bit OEM-Kodierung, C unterstützt die aber(genau wie Java) nur halbherzig, weshalb nur ASCII geht, es sei denn, du weißt viel über die beteiligten Zeichencodes und kannst die ausgeben. Unter Java gibt es dazu die Hilfsklasse Console, wie das in C aussieht (?)...

Du musst außerdem beim Umwandeln beachten, dass manchmal Bits abgeschnitten werden, ich glaube aber das es an der Konsole liegt... Du musst dann die Zeichencodes besorgen und diese ausgeben... 

Ich hoffe, ich habe dir geholfen,
Grüße, Tucan :-D


----------



## Dompteur (28. Jan 2015)

Die Variable “puffer” wird beim Aufruf der Funktion am Stack angelegt. Solange du dich in der Funktion befindest, ist alles in Ordnung. Beim Verlassen der Funktion wird der Stack wieder freigegeben. Der Pointer, der von der Funktion zurückgegeben wird, zeigt nun auf einen Speicher, der wieder als frei markiert ist. Es ist nun mehr oder weniger Zufall, wer diesen Speicher wieder nutzt und dann irgendetwas reinschreibt.

Du kannst das Problem auf verschiedene Arten lösen:
 * Du übergibt der Funktion einen Pointer auf einen Speicher. Die Funktion befüllt den Speicher dann.
 * Du reserviert in der Funktion Speicher am Heap und gibst den Pointer darauf zurück. Diesen Speicher musst du aber irgendwann wieder freigeben ! Dazu gibt es unter anderem die Funktionen : malloc und free.


----------



## Blender3D (18. Feb 2016)

Hier eine Möglichkeit mit getcwd();

As an extension to the POSIX.1-2001 standard, glibc's *getcwd*()
  allocates the buffer dynamically using malloc(3) if _buf_ is NULL.  In
  this case, the allocated buffer has the length _size_ unless _size_ is
  zero, when _buf_ is allocated as big as necessary.  The caller should
free(3) the returned buffer.


----------

