const char* aus Funktion zurückgeben
-
Hallo,
C-String-Literale werden ja statisch abgelegt.
Daraus folgt, dass ja solche Konstrukte möglich sein sollten:const char* foo() { if(...) return "Hallo!"; else return "Ciao!"; } ... const char* pText=foo(); cout<<pText; ...
Ist daran was auszusetzen?
(dass es std::string gibt, ist mir schon klar, es handelt sich eher um eine Verständisfrage)
-
dsfsf schrieb:
Ist daran was auszusetzen?
Nein.
-
Bashar schrieb:
dsfsf schrieb:
Ist daran was auszusetzen?
Nein.
ok danke.
Habe solche Konstruktionen nämlich irgendwie als "böse" in Erinnerung aus meinen C Zeiten, und war letztens ganz erstaunt, als ich gelesen habe, dass C Strings statisch abgelegt werden. Naja, Alzheimer lässt grüßen
-
und war letztens ganz erstaunt, als ich gelesen habe, dass C Strings statisch abgelegt werden
Genauer: Literale...
-
Daran auszusetzen ist erst ab dem Zeitpunkt etwas, wo man nicht mehr mit Literalen auskommt. Dann wird's nämlich einigermassen lästig alles umbauen zu müssen.
In Fällen wo das nicht vorkommen kann ist es aber vollkommen OK. Wozu Resourcen verbraten wenn's nicht sein muss.
(Bzw. auch in Fällen wo eine evtl. später nötige Anpassung kein grosses Problem darstellt, z.B. weil man davon ausgehen kann dass die Funktion garantiert nur an ausreichend wenig Stellen aufgerufen wird.)
-
dsfsf schrieb:
Habe solche Konstruktionen nämlich irgendwie als "böse" in Erinnerung aus meinen C Zeiten, und war letztens ganz erstaunt, als ich gelesen habe, dass C Strings statisch abgelegt werden.
Böse ist das nicht. Allerdings ist es eine Schnittstelle nicht dafür geeignet, die Funktion dahingehend zu erweitern, dass auch zur Laufzeit berechnete Zeichenketten zurück gegeben werden; denn
const char* foo() { char temp[99]; ...string bauen... return temp; }
ist wirklich böse (gibt einen ungültigen Zeiger zurück)
const char* foo() { static char temp[99]; ...string bauen... return temp; }
ist nicht thread-safe und
const char* foo() { char *ptr = new char[99]; ...string bauen... return ptr; }
führt zu einem Speicherleck, es sei denn, der Aufrufer löscht den Kram dann irgendwann wieder.
Möchtest du also die Zeichenketten zur Laufzeit berechnen, weil sie von irgendwelchen Variablen abhängen, solltest du die Schnittstelle zu
std::string foo();
abändern.