char* als Rückgabewerte Probleme

Zel2491

Aktives Mitglied
Nabend,

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

Java:
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
Java:
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 ;-)
 
Zuletzt bearbeitet:

Tucan

Bekanntes Mitglied
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

Top Contributor
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

Top Contributor
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.
 

Ähnliche Java Themen

Neue Themen


Oben