scope von return static char s[]
-
Hallo,
ich bin grade etwas verwirrt ...
Unten die Beispiele, wieso funktioniert bla2()?
bla4() verwendet den default copy-constructor oder?class ClassA{ public: ClassA(){ i=42; }; int i; private: }; char* bla1(){ char s[10]="123456789"; return s; } char* bla2(){ static char s[10]="123456789"; return s; } char* bla3(){ char* s = new char[10]; s="123456789"; return s; } ClassA bla4(){ ClassA a; return a; } ClassA* bla5(){ ClassA a; return &a; } ClassA* bla6(){ ClassA* a = new ClassA(); return a; } int _tmain(int argc, _TCHAR* argv[]) { char* c1 = bla1(); //Funktioniert nicht char* c2 = bla2(); //Funktioniert, wieso? char* c3 = bla3(); //Funktioniert ClassA a1 = bla4(); //Funktioniert ClassA* a2 = bla5(); //Funktioniert nicht ClassA* a3 = bla6(); //Funktioniert return 0; }Danke!
-
Wegen static? Das Array hat jetzt statische Lebenszeit. (Grob gesagt ist es gültig von Anfang bis Ende von main()) Zeile 23 macht nicht was du denkst.
-
bla3 funktioniert nicht.
-
manni66 schrieb:
bla3 funktioniert nicht.
doch, es macht nur keinen sinn - aber funktionieren tut es einwandfrei.
-
Shade Of Mine schrieb:
manni66 schrieb:
bla3 funktioniert nicht.
doch, es macht nur keinen sinn - aber funktionieren tut es einwandfrei.
Das ist eine Frage der Definition von funktionieren. Spätestens wenn der String geändert werden soll, landet man bei UB wie bei den anderen nicht funktionierenden Funktionen.
-
danke!
ja zu bla3() hab mich schon gewundert das das geht ...aber nochmal zu bla2 ... wenn man das ein 2. mal aufruft scheint es den Wert
des ersten Aufrufes zu überschreiben oder?
Also s existiert nur einmal im Speicher?
-
diego2k schrieb:
danke!
ja zu bla3() hab mich schon gewundert das das geht ...Das korrekte bla3 wäre:
char* bla3(){ char* s = new char[10]; strcpy(s,"123456789"); return s; }aber deins funktioniert, weil die Zuweisung
s="123456789";
insofern OK ist, da "123456789" ewig gültig ist.aber nochmal zu bla2 ... wenn man das ein 2. mal aufruft scheint es den Wert
des ersten Aufrufes zu überschreiben oder?
Also s existiert nur einmal im Speicher?ja.
static ist hier das zauberwort.
-
danke!
-
Nur um die Begrifflichkeiten richtigzustellen:
Scope bezieht sich immer auf einen bestimmten Bezeichner, und bezeichnet den Teil des Programmes, in dem dieser Bezeichner unqualifiziert verwendet werden kann, um auf eine bestimmte Entität zu verweisen.Davon ist zu unterscheiden die Lebenszeit eines Objektes. Bei automatischen Objekten beginnt die Lebenszeit eines Objektes, sobald der Kontrollfluss die zugehörige Definition erreicht, und endet, wenn der (potentielle) Scope des zugehörigen Bezeichners verlassen wird.