Du ertsellst mit "char *zeichen;" einen Pointer auf einen char. Der Pointer ist eine Adresse, die auf einen Speicherbereich zeigt. Da du dem Pointer keine Adresse zuweist, versucht er den String "irgendwohin" (undefiniert!) zu kopieren. Das geht auf jeden Fall schief, da du nichtmal einen Speicherbereich angefordert hast, an dem der String zufällig korrekt landen könnte.
Du musst also erst mit malloc() Speicher anfordern, der groß genug ist, den String zu halten.
Da der Speicher beim Verlassen der Funktion nicht wieder freigegeben wird (wäre ja auch doof, dann wäre der string wieder weg), ist er auch nach Verlassen der Funktion noch verfügbar. Weist du den Pointer nicht neu zu, dann hast du ein Speicherleck, da du keinen Zugriff mehr auf den in der Funktion allozierten Speicher hast.
In der Main-Funktion nutzt du also nicht strcpy, sondern weist dem Pointer "text" den Pointer zu, der von der Funktion zurück gegeben wird.
Code: Alles auswählen
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char *Testfkt(const char *sValue) {
/* malloc fordert Speicher an und gibt die Adresse des Speichers zurück */
char *zeichen = malloc(100 * sizeof (char));
/* Jetzt kann der String kopiert werden, da "zeichen" eine Adresse hat, an der
genügend Speicher reserviert ist. */
strcpy(zeichen, sValue);
return zeichen;
}
int main() {
/* Die Adresse an der der in der Funktion reservierte Speicher mit dem kopierten
String liegt, wird hier deinem Pointer Text zugewiesen. */
char *text = Testfkt("Hallo Otto");
printf("Hallo Welt : ---> %s\n", text);
return EXIT_SUCCESS;
}
Wenn du es ganz sauber willst, musst du den Speicher natürlich auch wieder frei geben. Außerdem wäre es eventuell besser keine feste Menge Speicher anzufordern, sondern die, die du brauchst um den String zu halten.