String RückgabeWert will nicht funktionieren
-
Hallo,
bin ganz neu hier und stelle gleich mal die erste Frage:
Ich versuche einen String zurückzugeben und anschließend in der main Funktion auszugeben:
char TestFunktion(){ . . char TestA[3]="xyz"; . . return TestA;} und in der Main-Funktion: TestFunktion(); printf("%s", TestFunktion);
Er gibt mir irgendwas aus, also der Wert ist schonmal nicht leer. aber es steht nicht dass drinnen, was ich vorhin zugewiesen habe. Außerdem gibt mir der Compiler einW arning aus, dass ich eine lokale Variable übergeben will..aber dass ist ja logisch, wäre sie global müsste ich sie ja nicht übergeben..
Bitte um rasche Hilfe, danke schonmal im voraus.
LG Mike
-
muss das nicht return eines Pointers sein ?
und die Definition
char *TestA
und vor dem Füllen ein malloc(testa,wasweissichwievielebytes)
Free im Main nicht vergessen genausowenig wie das Hufe auskratzen
-
MikeTheT schrieb:
Bitte um rasche Hilfe,...
Ja, der Abgabetermin rückt wohl näher.
In C gibt es keinen Datentyp String.
Eine char-Folge, abgeschlossen mit '\0' wird als String bezeichnet.
In C kann man auch kein Array als Returnwert einer Funktion verwenden, so wie du es versucht hast.
Du hast als Returnwert deiner Funktion char definiert, gibst aber eine (lokale!) Variable vom Typ char[3] zurück.
Das passt schon typmäßig nicht, und ist auch sinnfrei hinsichtlich des verwendeten Speichers, da funktionslokaler Speicher außerhalb der Funktion ungültig ist, steht (zugegebenermaßen) nicht in jedem Lehrbuch/Tutorial/Vorlesungsskript.const char *TestFunktion(void){ const char *TestA="xyz"; return TestA; }
würde funktionieren,
const char *TestFunktion(void){ const char TestA[]="xyz"; return TestA; }
jedoch nicht.
Wenn du begriffen hast, warum das so ist, bist du einen großen Schritt weiter , näherst dich dem Fortgeschrittenen-Stadium, bist damit aber schon einer Vielzahl von Fachbuchautoren/Tutorialschreiberlingen/Hochschuldozenten überlegen.
-
Wutz schrieb:
Du hast als Returnwert deiner Funktion char definiert, gibst aber eine (lokale!) Variable vom Typ char[3] zurück.
Das passt schon typmäßig nicht, und ist auch sinnfrei hinsichtlich des verwendeten Speichers, da funktionslokaler Speicher außerhalb der Funktion ungültig ist, steht (zugegebenermaßen) nicht in jedem Lehrbuch/Tutorial/Vorlesungsskript.Grundsätzlich mal meine erste Frage: Das heißt Typ Char und Typ char[7] z.B.: ist nicht das selbe..sind also unterschiedliche Typen?
Für den Rest muss ich mich noch einlesen..
Und nein, keine Prüfung, mache das freiwillig !!
LG und Danke !
-
Achte auf die Schreibweise.
Es ist char (klein). Und ja, ein char-Array ist etwas anderes.
Die Elemente bestehen zwar aus char, aber es wird anders behandelt.Vor allem sollte es eine Menge Warnungen geben, deren Ursache du beseitigen musst.
Und damit meine ich nicht das ändern des Warnlevels.Lass mal in Zeile 5 die 3 weg. Oder ändere sie in eine größere ZAhl.
-
Um es nochmal anders auszudrücken:
char TestA[] = "xyz";
...wäre equivalent zu...
char TestA[4] = {'x','y','z','\0'};
Ein char Array, verwendbar als String, dessen Ende sich durch das Terminierungszeichen '\0' (binär 0) auszeichnet.
(Dein Array auf 3 Felder zu reduzieren, obwohl der String MIT Terminierungszeichen 4 braucht, sollte allein schon zu Meldungen des Compilers führen.)
Das wären 4 lokale Bytes, die nur im eigenen Scope verwendbar sind. Nun ist das Problem, dass TestA nicht einfach ein Datentyp ist, der den Speicher ausdrückt, wie z.B. int, sondern die Adresse zum ersten Byte des Speichers hält, wie es für gewöhnlich auch Pointer tun. Mit Rückgabe von TestA wird also nicht der Speicher des Strings kopiert, sondern die Adresse, welche anschließend ungültig wird.
Hingegen...const char *TestA="xyz";
...ist ein Zeiger auf ein Stringliteral, welches global im Programmspeicher existiert, dessen Adresse wird nach Rückgabe/verlassen des Scopes nicht ungültig. Dast const ist dabei sinnvoll, weil Stringliterale nicht verändert werden sollten, beim char Array dagegen ist dies erlaubt.