str = L"123456789" + L'0';



  • Hi, ist folgender Code valid oder kommt da Murks raus?

    std::wstring str;
    	str = L"123456789" + L'0';
    

    Zumindest bekomme ich teilweise Textfragmente aus anderen Strings ausgegeben. Vielleicht ist aber auch nur meine Anwendung zerschossen ;).



  • Achso, wenn ich mir mal den String über die gesamte Capacity ausgeben lasse sind dort auch teilweise Textfragmente von anderen Strings erkennbar. Wird hier der Speicherbereich nicht beim Anfordern mit z.B. 0 initialisert?



  • AmEnde schrieb:

    Hi, ist folgender Code valid oder kommt da Murks raus?

    Da kommt Murks raus.

    Hintergrund ist, dass das Literal L"123456789" einen Zeiger auf die Adresse des ersten Elements zurückliefert.

    Durch + L'0' wird keine Konkatenation ausgeführt sonder Zeigerarithmetik, d.h. du verschiebst den Zeiger um den Wert von L'0'.

    Deine Variable str wird dann mit dem initialisiert, was an der resultierenden Speicherstelle zu finden ist.



  • Seltsam, dass das der Compiler nicht schon bemängelt. Ein + L"\0"; wird ja auch als Fehler wegen Zeigeraddition angezeigt.



  • AmEnde schrieb:

    Seltsam, dass das der Compiler nicht schon bemängelt. Ein + L"\0"; wird ja auch als Fehler wegen Zeigeraddition angezeigt.

    Ja, aber hier hast du (nach dem array-to-pointer-decay) const wchar_t* + const wchar_t* . Zwei Zeiger kannst du nicht addieren.

    Hingegen sind mit + L'0' die Typen const wchar_t* + wchar_t im Spiel. wchar_t ist ein integraler Typ und kann als solcher als Zeiger-Offset verwendet werden.


  • Mod

    Da könnte zum Beispiel auch str = L"123456789" + 3; stehen (denn ein char-Literal ist auch nur eine Zahl), dann wird deutlich was da geschieht und warum der Compiler nicht meckert. Dann hätte str den Inhalt "456789".


Anmelden zum Antworten