char* als Rückgabewert?
-
Hallo!
Ich möchte aus meiner Funktion einen char* auf ein char[] zurückliefern.
Wird der Speicher für das Array nach dem Beenden der Funktion wieder Freigegeben oder nicht?/**AUFRUF*/ //hier soll der Text landen char *errmsg; //Aufruf der Funktion errmsg = GetSGErrorString(errorID); //Hier soll mit dem Text weiter gearbeitet werden //.... /**FUNKTION*/ char* GetSGErrorString(int ierrorID) { char errmsg[1024]; switch(ierrorID) { case 1:sprintf(errmsg,"Fehler beim erstellen der Direct3D-Schnittstelle!"); break; case 2:sprintf(errmsg,"Adapterinformationen konnten nicht abgefragt werden!"); break; default:sprintf(errmsg,"Unbekannter Fehler!"); break; }; return &errmsg; }
Funktioniert das nur weil der Speicher für das "char errmsg[1024]" noch nicht überschrieben wurde oder wird der Speicher sowieso nicht freigegeben?
MFG, Sigi
-
Ich glaube es liegt an dem return &errmsg;.
Durch das & gibst Du ja die Refferenz und nicht die Speicheradresse zurück.
-
errmsg hat automatische Lebensdauer / liegt auf dem Stack, d.h. die Variable hört beim Verlassen ihres Gültigkeitsbereiches (= der Funktion) auf zu existieren. Der zurückgegebene Zeiger zeigt nur noch auf ihre leblosen Reste, die im Einzelfall noch intakt sein können, aber nicht müssen. Ich weiß nicht, was du mit den Error-Strings vorhast, aber vielleicht wäre es besser, direkt Pointer auf Stringliterale zurückzugeben:
const char * error_string(int i) { switch(i) { case 1: return "error text 1"; case 2: return "error text 2"; ... } } // oder gleich: static const char * error_messages[] = { "error text 1", "error text 2", ... }; const char * error_string(int i) { return error_messages; }
daishi:[i]Durch das & gibst Du ja die Refferenz und nicht die Speicheradresse zurück.*
Was meinst du mit Referenz? Erstens gibt es sowas in C nicht, und zweitens gibt das auch in C++ die Adresse zurück.
-
Hab das mal kurz geändert.
return &errmsg;
zu
return errmsg;Ich wollt nur mal wissen wenn ich nur einen Zeiger zurück gebe dann bleibt der Speicher ja der gleiche,
aber wenn der Speicher der gleiche bleibt und der Speicher in der Funktion ohne new reserviert wurde, dann wird er normalerweise nach dem beenden der Funktion doch freigegeben. Oder nicht?Und wenn der Speicher freigegeben wurde dann darf ich ihn doch nicht mehr benutzen.
Oder bleibt der Speicher reserviert solange ein Zeiger auf ihn zeigt?
-
Danke Bashar!
Du warst schneller mit dem absenden der Antwort, als ich mit dem schreiben meiner zweiten Frage!Schöne Grüße an beide! Danke!
Sigi