Verwunderung über eigenen Code
-
Hallo,
ich habe schon zig Funktionen geschrieben, die des öfteren Strings entgegennehmen und auch zurückgeben. Das mache ich alles über Pointer like:Ist das ok, wenn ich immer mit Pointern arbeite? Ist das nicht gefährlich???
char *test(char *var) { char *point = "var"; return point; }
-
IIRC entspricht dein Geschreibsel nicht dem Standard
Richtig müsste es heissen
const char * test() { const char * s = "Test"; return s; // mehr oder weniger äquivalent zu: // return "Test" }
s lässt sich dann nicht mehr verändern.
-
Wieso? Was kann denn passieren wenn ich die Variablen nicht als const deklariere?
Die Übergabe läft ja nur einmal vonstatten..
-
Was kann denn passieren wenn ich die Variablen nicht als const deklariere?
Es könnte zu hässlichen Laufzeitfehlern führen, wenn jemand versucht denn String zu verändern. Das wird durch const verhindert da es Schreibzugriff verbietet.
BTW: Es gibt std::stringmfg
-
hmm, also die stringvariable die da in der funktion erzeugt wird wird am ende der funktion wieder "zerstört" d.h. eigentlich ist der zurückgegebene pointer ungültig. in manchen fällen mag das ja trotzdem klappen. aber im prinzip kann der speicher einfach überschreiben werden von einer anderen funktion etwa.
-
Hallo,
char *test(char *var) { char *point = "var"; return point; }
Abgesehen von dem, was japro gesagt hat: Wieso übergibst du einen Zeiger an die Funktion, wenn du ihn eh nicht benutzt?
-
@Name
String Literale werden implizit in nicht const char*s gecastet. Gibt aber trotzdem undefined behaviour (idr. segmentation fault oder so was) wenn du da reinschreiben willst.@japro
Stringliterale überleben AFAIK vom Standard her das ganze Programm, da sie nicht auf dem Stack liegen. Folgendesinline const char *foo() { return "foo"; }
sollte deshalb okay sein. Was anderes ist das
inlint int *bar() { int i=1; return &i; }
weil i hier vom Stack gehauen wird wenn bar zu Ende ist. So was passiert einem aber eher mit Referenzen IMHO und zum Glück warnen die Compiler mittlerweile ja davor
@Steppen
schau dir mal std::string an, dass ist mehr C++ig und umgeht viele Probleme der C strings