Variablengültigkeit
-
mit static hast du nur eine "Version" der Variablen - die wird jedes Mal wiederverwendet, wenn du die Funktion neu aufrufst.
(und um Strings zu übergeben, empfehle ich std::string)
-
IMHO sollte das erste Beispiel (char*) sogar korrekt laufen, da hier nicht die Adresse des charpointers auf dem Stack sondern die Adresse des konstanten Strings "Test" (welcher im Data-Segment liegen müsste) zurückgegeben wird.
Also:
char *string = "Test"; // "string" sind 4 Byte Zeiger auf dem Stack. // "string" enthält Adr. von konstantem String "Test" return string; // Eben jene Adr. wird zurückgegeben und die 4 Byte // der Variable "string" freigegebenOder?!
-
danke.
-
LordJaxom schrieb:
IMHO sollte das erste Beispiel (char*) sogar korrekt laufen, da hier nicht die Adresse des charpointers auf dem Stack sondern die Adresse des konstanten Strings "Test" (welcher im Data-Segment liegen müsste) zurückgegeben wird.
Also:
char *string = "Test"; // "string" sind 4 Byte Zeiger auf dem Stack. // "string" enthält Adr. von konstantem String "Test" return string; // Eben jene Adr. wird zurückgegeben und die 4 Byte // der Variable "string" freigegebenOder?!
ich denke, das genau ist mein problem. ich glaube aber das es nicht funktioniert.
char *string = "Test"ist ja nur eine Abkürzung für
char string[5]; string[0] = 'T'; string[1] = 'e'; string[2] = 's'; string[3] = 't'; string[4] = 0;und der bereich wird dann wieder am Ende der Funktion freigegeben, nicht? ein Array muss man ja nicht wieder mit delte freigeben!
-
Nein, das ist nicht das selbe - das Literal wird in dem Fall im Datensegment gelagert und string bekommt die Adresse dieses Bereichs zugewiesen (die Abkürzung für die Initialisierung wäre char "string[]="Test";").
Wie gesagt, auf der sicheren Seite bist du wirklich nur mit new (aber dann das delete nicht vergessen) oder std::string:
string stringfunction() { string data="Test"; return data;//hier werden die Zeichendaten evt. kopiert }
-
CStoll schrieb:
Nein, das ist nicht das selbe - das Literal wird in dem Fall im Datensegment gelagert und string bekommt die Adresse dieses Bereichs zugewiesen (die Abkürzung für die Initialisierung wäre char "string[]="Test";").
Wie gesagt, auf der sicheren Seite bist du wirklich nur mit new (aber dann das delete nicht vergessen) oder std::string:
string stringfunction() { string data="Test"; return data;//hier werden die Zeichendaten evt. kopiert }okay! also werden normale arrays auf dem stack angelegt?
was meinst du mit "evtl. kopiert"?
-
lokale Variablen kommen grundsätzlich auf den Stack. Alles was mit new angelegt wird auf den Heap.
-
adsci schrieb:
was meinst du mit "evtl. kopiert"?
std::string verwaltet die Zeichen auf dem Heap und kümmert sich selber um die new/delete Angelegenheiten. Da hängt es von der Implementierung ab, ob bei "return data;" nur der Zeiger auf die exisiterenden Daten übergeben wird oder ein neuer Bereich mit einer Kopie angelegt wird.
-
na, da muss ich das letztere erhoffen...
danke, in jedem fall! hast mir weitergeholfen!
-
adsci schrieb:
na, da muss ich das letztere erhoffen...
Nö, erhoffen musst du gar nichts. Wenn std::string hier nur ein simples return macht, weil es zB mit COW Semantik implementiert ist, dann kann dir das auch egal sein. Das ist ja auch das schöne an solchen Containern. Ihre Funktionalität ist immer gleich, egal wie sie implementiert sind.
-
adsci schrieb:
char *string = "Test"Nur so zur Info, diese Konvertierung (von const char[] nach char*) ist veraltet und sollte nicht mehr verwendet werden (reines Kompatibilitätsfeature zu C). Sie wird auch öfters liebevoll als "Conversion of Death" bezeichnet, da ein Zeiger auf ein Literal plötzlich schreibbar gemacht wird. Da das Literal 'ROMable' ist, liegt es wahrscheinlich nicht im Datensegment, sondern wird eher vom Loader in einen schreibgeschützten Bereich geschoben. Im besten Falle stürzt das Programm bei einem Schreibzugriff ab. Falls der Schreibzugriff gelingen sollte, ändert man vielleicht gleich andere Literale mit, da diese überlagert gespeichert werden dürfen.