Rückgabe von Strings aus der Funktion
-
Hallo. Ich habe jetzt mal eine ganz simple Anfängerfrage:
Ich muss ziemlich oft aus einer Funktion einen String zurückgeben, den ich nachher weiterverarbeite.
Das Ganze sieht im Prinzip so aus:
//declaration char* FKT_gibstring(void); //definition char* FKT_gibstring(void) { char text[255]; strcpy(text,"Das ist der String den ich nachher haben will, wird dynamisch in dieser Funktion erstellt!"); return text; } //Haupfunktion ...main (usw) { //irgendwelche Operationen char gibtext[255]; strcpy(gibtext,FKT_gibstring()); printf("%s",gibtext); //weitere Operationen mit gibtext. ...usw }
Das verdeutlicht nur das Prinzip.
Wenn ich das so mache kommt eine Warnung (VC++):
Warnung 68 warning C4172: Adresse einer lokalen Variablen oder eines temporären Werts wird zückgegeben
...:\httpd\selbstauskunft\src\kalender.cpp 1928Aber anders kann ich das doch nicht machen, oder?
Oder wie kanni ch den String zurückgeben und in main weiterverwenden?Danke Mondmann
-
static char text[255];
benutzen.
-
Man darf keine Pointer auf Stackvariablen zurückgeben.
Mach es wie in den Standardfunktionen:
char* funktion (char* buffer, int length) { strncpy (buffer, length, "bla bla bla bla bla bla"); return buffer; } int main() { char* c = (char*)malloc (sizeof (char) * 555); printf ("%s\n", funktion (c, 555)); free (c); return 0; }
*edit* Wenn es immer der gleiche String ist hat dann mach es mit static wie feigling bereits schrieb.
-
@ neko: Der cast bei malloc() ist vollkommen überflüssig. Und sizeof(char) ist immer 1. Und die Reihenfolge der Parameter bei strncpy stimmt auch nicht.
-
Der cast bei malloc() ist vollkommen überflüssig
Warum is der Cast überflüssig?
Malloc gibt doch void* zurück, also muss man dem sagen was ich habe will, oddr`?void *malloc(size_t size);
Mondmann
-
Nein, void* werden schon seit vieeeelen Jahren implizit in den jeweiligen Zieltyp umgewandelt.
-
TactX schrieb:
@ neko: Der cast bei malloc() ist vollkommen überflüssig. Und sizeof(char) ist immer 1. Und die Reihenfolge der Parameter bei strncpy stimmt auch nicht.
Sorry, weiß nicht genau wie das bei ANSI C ist, ich habe direkt mit C++ angefangen zu coden
-
Ich sollte den Puffer innerhalt der Funktion erstellen und den Inhalt zurückgeben.
DAs ist das Problem...
MOndmann
-
Dann benutz halt malloc() _in_ der Funktion.
-
dann würde es so aussehen mit malloc():
//declaration char* FKT_gibstring(void); //definition char* FKT_gibstring(void) { char* text=(char*)malloc(255); strcpy(text,"Das ist der String den ich nachher haben will, wird dynamisch in dieser Funktion erstellt!"); [b]free(text);[/b] return text; } //Haupfunktion ...main (usw) { //irgendwelche Operationen char gibtext[255]; strcpy(gibtext,FKT_gibstring()); printf("%s",gibtext); //weitere Operationen mit gibtext. ...usw }
das geht so aber nicht, weil ich den Speicher ja innerhalb der Funktion wieder freigeben muss.
Somit ist der Speicher zerstört und ich kann nichts mehr zurückgeben.
Es muss doch eine richtige Lösung geben, wie macht Ihr denn das immer?Mondmann
-
Ähm, folgende Idee: Den Speicher vor dem Zurückgeben einfach mal nicht free'n sondern erst dann wenn Du ihn nicht mehr brauchst?!?
-
Wer sagt daß du den Speicher in der Funktion wieder freigeben musst? Den kannst du freigeben wo und wann du willst. Ich würde an deiner Stelle aber dem Vorschlag von Neku folgen.
-
free woanders aufrufen?
Warum nimmst du nicht einfach "static". Ist zwar nicht wirklich klasse gelöst aber auf jeden Fall besser als malloc in der Funktion aufzurufen und free irgendwo "Am Arsch der Welt".
Ausserdem castet man den Rückgabewert von malloc nicht.
-
feigling schrieb:
Warum nimmst du nicht einfach "static". Ist zwar nicht wirklich klasse gelöst aber auf jeden Fall besser als malloc in der Funktion aufzurufen und free irgendwo "Am ***** der Welt".
Was ist wenn er die Funktion mehrmals aurfufen will und alle Ergebnisse behalten will? Nene, malloc() ist da schon besser.
-
Hat er aber nirgendwo erwähnt, dass er das machen will
Kommt halt drauf an, für was die Funktion gut sein soll. Ruft man die Funktion ein paar Mal auf und der alte Wert ist egal, würde ich ganz klar static nehmen, sonst natürlich malloc.