Problem beim erstellen eines Objekts mit new



  • Ahh okay, eine Frage hab ich noch 😃

    Hab schon öfters gesehen, das char* pointer für Zeichenketten benutzt werden.

    in diesem Beispiel zeigt der pointer ja auf das erste byte des Strings, also das "T".

    char *t;
    t = "Test!";
    
    cout << t;
    

    Ich versteh nicht, wie das Programm funktionieren kann, da erstens bei der initialisierung der * vor dem t fehlt und die Ausgabe dann doch eigentlich die Adresse sein müsste?

    und zweitens woher weiß das Programm bei cout << t die Länge des Strings?



  • Erstens muss es

    const char* t = "blubb";
    

    heißen.
    Zweitens hat jedes string-Literal eine Adresse, auch wenn das zuerst komisch erscheint. Der string liegt aber in einem Read-Only bereich, du darfst da also nichts ändern.

    C-Strings sind 0-terminiert, das heißt, der string hat am Ende immer eine 0, nicht '0' oder "0" sondern 0. Die Länge des String "muh" ist damit 4.



  • Der Code funktioniert garnicht (undefiniertes Verhalten) Der Pointer zeigt auf irgendeine Adresse. Es wurde weder eine gültige Adresse auf dem Stack angegeben ) noch Speicher auf dem Heap für den String reserviert. Wie ich in meinem Post vorher schon erläutert habe.

    Ein String wird immer mit '\0' abgeschlossen. somit hat ein char array[6] auch nur maximal 5 Zeichen, da das Sechste für die Nullterminierung benötigt wird. Strings in Anführungszeichen angegeben haben eine Nullterminierung.



  • HighLigerBiMBam schrieb:

    Der Code funktioniert garnicht (undefiniertes Verhalten) Der Pointer zeigt auf irgendeine Adresse. Es wurde weder eine gültige Adresse auf dem Stack angegeben ) noch Speicher auf dem Heap für den String reserviert. Wie ich in meinem Post vorher schon erläutert habe.

    Bei mir gehts schon die ausgabe ist "Test!"

    soweit ich weiß ist

    char* t = "blubb";
    

    die verkürzte version von

    char *t;
    	t = "blubb";
    


  • Nein, die richtige 🤡



  • 314159265358979 schrieb:

    Nein, die richtige 🤡

    okay und was ist an der anderen falsch??



  • Das const fehlt.



  • 314159265358979 schrieb:

    Das const fehlt.

    vielleicht sollte meine Variable auch gar keine Konstanste sein? 😃



  • Wenn du den string so zuweist, MUSS sie const sein.



  • wasd schrieb:

    Ich versteh nicht, wie das Programm funktionieren kann, da erstens bei der initialisierung der * vor dem t fehlt und die Ausgabe dann doch eigentlich die Adresse sein müsste?

    Du weist die Adresse des Stringliterals dem char -Zeiger zu. Die Ausgabe funktioniert, weil der Stream-Operator für char* überladen ist.

    wasd schrieb:

    vielleicht sollte meine Variable auch gar keine Konstanste sein?

    Ist sie so oder so nicht. Aber der Zeiger soll auf const zeigen. "Der string liegt aber in einem Read-Only bereich, du darfst da also nichts ändern." Daher ist bei Stringliteralen nur const char* sinnvoll.

    Wo liegt dein momentanes Problem?



  • Hast du das gelesen?

    wasd schrieb:

    soweit ich weiß ist

    char* t = "blubb";
    

    die verkürzte version von

    char *t;
    	t = "blubb";
    

    Nein. Kürzlich gab es wieder ein Thread darüber. Der erste Code ruft den Ctor auf und der zweite den Zuweisungsoperator. Bei korrekter Implentierung spielt es keine Rolle. Aber beim ersten wird der Ctor aufgerufen und beim zweiten wird der Ctor und der Zuweisungsoperator aufgerufen.



  • EOutOfResources schrieb:

    Der erste Code ruft den Ctor auf

    char* hat keinen Konstruktor. Bei skalaren Typen macht sind beide Schreibweisen äquivalent. Allerdings ist eine schnelle Initialisierung zu bevorzugen, bei der zweiten Version sehe ich keine Vorteile.


Anmelden zum Antworten