Christian Seiler: Einige C-Fragen

Beitrag lesen

Hallo,

Warum funktioniert das Programm:

#include <stdio.h>
#include <string.h>

char *myfunc(void) {
    char *output = "Output";
    //strcat(output, arg);
    return output;
}

int main(void) {
    char *result = NULL;
    result = myfunc();
    printf("Ergebnis der Funktion: %s\n", result);

return 0;

}

Folgt man der Argumentation im obigen Link, müsste doch ein Segmentation fault zu erwarten sein, da ja output ein lokaler Pointer ist und demnach nach Ausführung der Funktion vom Stack schon verschwunden sein muss.

Nein, der Speicherbereich, auf den output zeigt, wird hier *nicht* auf dem Stack alloziert. Der String "Output" ist nämlich (weil's ein String ist, der 1:1 in der Source-Datei vorkommt) schon in der ausführbaren Datei, die Du erstellst, enthalten und wird beim Laden des Programms in den Speicher geladen (genau so wie alle anderen Strings die Du direkt in den Source schreibst). Auf diesen (im Programm immer verfügbaren) Speicherbereich zeigt dann output, das Du zurückgibst.

Etwas anderes wäre es, wenn Du folgendes machen würdest:

char output[] = "Output";

Dann wird nämlich auf dem Stack ein Array der Größe 7 (6 Zeichen + 0-Byte) angelegt und dort dann "Output" reingeschrieben und das zurückgegeben. Wenn Du das dann ausführst, dann bekommst Du je nach Zufall entweder eine Segfault oder zumindest Datenmüll als Ausgabe.

Viele Grüße,
Christian