Wie dynamisches Char-Array anlegen?


  • Administrator

    Nexus schrieb:

    char* CharArray = new char[46];
    delete[] CharArray;
    

    Ich sehe es schon kommen:

    // Copy&Paste
    char* CharArray = new char[10];
    delete[] CharArray;
    
    // Und nun verwenden ...
    CharArray[0] = 0;
    

    Yay! 😃 🤡

    @skullyan,
    Ich hoffe, dass dir bewusst ist, was an meinem hier oben präsentierten Code falsch ist? Wenn nicht, solltest du vielleicht doch lieber das Kapitel nochmals in deinem lieblings C++ Buch nachlesen 😉

    Grüssli



  • Dravere schrieb:

    Nexus schrieb:

    char* CharArray = new char[46];
    delete[] CharArray;
    

    Ich sehe es schon kommen:

    // Copy&Paste
    char* CharArray = new char[10];
    delete[] CharArray;
    
    // Und nun verwenden ...
    CharArray[0] = 0;
    

    Yay! 😃 🤡

    @skullyan,
    Ich hoffe, dass dir bewusst ist, was an meinem hier oben präsentierten Code falsch ist? Wenn nicht, solltest du vielleicht doch lieber das Kapitel nochmals in deinem lieblings C++ Buch nachlesen 😉

    Grüssli

    Spielst Du auf das delete[] an? Wenn nicht, ist's mir nicht bewusst...

    😕



  • Er meint, dass du selbstverständlich das Array mit new[] anlegen, dann benutzen und wenn du's nicht mehr brauchst, mit delete[] zerstören musst. Also nicht seinen Code copy-pasten und im Anschluss das Array benutzen. Ich halte das einerseits schon für weit hergeholt (die Namensgebung der Schlüsselwörter ist ja eigentlich eindeutig), andererseits ist man hier im Forum schon einiges gewöhnt. 😉


  • Administrator

    _matze schrieb:

    Ich halte das einerseits schon für weit hergeholt ...

    Ist es wirklich so weit hergeholt, wenn jemand sowas in einem Forum fragen muss? Jeder der C++ gelernt hat, weiss dies, da es absolute Grundlagen sind. Und wenn man sich nicht mehr ganz sicher ist, ist der Griff zum Buch meistens deutlich schneller, als extra in einem Forum nachfragen zu gehen.

    Also ich weiss nicht, ich hatte da einfach leichte Befürchtungen ... 😉

    Grüssli



  • Ich vermisse hier den Hinweis, doch lieber:

    vector<char> CharVektor(46);

    zu benutzen ...



  • Oder std::string str und dann einfach frei verwenden...



  • Ein logischer Verstand sollte eigentlich erkennen, dass delete[] höchstwahrscheinlich zum Löschen des Arrays führt. Das nicht jeder Verstand logisch denkt, beweisen jeden Tag zig Beiträge in diesem Forum, daher ist deine Befürchtung natürlich schon irgendwie gerechtfertigt. 😉



  • _matze schrieb:

    Er meint, dass du selbstverständlich das Array mit new[] anlegen, dann benutzen und wenn du's nicht mehr brauchst, mit delete[] zerstören musst. Also nicht seinen Code copy-pasten und im Anschluss das Array benutzen. Ich halte das einerseits schon für weit hergeholt (die Namensgebung der Schlüsselwörter ist ja eigentlich eindeutig), andererseits ist man hier im Forum schon einiges gewöhnt. 😉

    Naja, das hat ja nichts mehr mit C++-Programmierungsfaehigkeit zu tun. Eher mit Englischkenntnissen. Und dıe habe ich zumindest ausreichend..
    😃



  • Tachyon schrieb:

    Oder std::string str und dann einfach frei verwenden...

    Das ist aber etwas völlig anderes. In einem 'string' wird zB ein Byte mit dem Wert 0 bereits interpretiert.


  • Administrator

    skullyan schrieb:

    Naja, das hat ja nichts mehr mit C++-Programmierungsfaehigkeit zu tun. Eher mit Englischkenntnissen. Und dıe habe ich zumindest ausreichend..
    😃

    Naja, es gibt auch Leute die hätten enstprechende Englischkenntnisse und trotzdem würden sie den Fehler machen, weil sie einfach zu faul sind, selber zu überlegen und zum Beispiel genauer hinzuschauen oder selber nachschauen ...

    Mir ist es eben ein Rätsel, dass man so eine grundsätzliche Frage in einem Forum stellt 😉

    Belli schrieb:

    Das ist aber etwas völlig anderes. In einem 'string' wird zB ein Byte mit dem Wert 0 bereits interpretiert.

    Würdest du das noch ein wenig genauer erläutern, was du hiermit meinst? Vor allem mit dem Ausdruck 'string'. Ich hoffe, dass du damit im allgemeinen eine Zeichenkette meinst und nicht den std::string ?
    Und ob es in diesem Fall wirklich etwas völlig anderes ist, kann man schlecht beurteilen, da wir nicht wissen, was Skullyan mit dem Array machen will 😉

    Grüssli



  • Belli schrieb:

    Tachyon schrieb:

    Oder std::string str und dann einfach frei verwenden...

    Das ist aber etwas völlig anderes. In einem 'string' wird zB ein Byte mit dem Wert 0 bereits interpretiert.

    Dann nimm halt ein std::vector<char>



  • Dravere schrieb:

    Belli schrieb:

    Das ist aber etwas völlig anderes. In einem 'string' wird zB ein Byte mit dem Wert 0 bereits interpretiert.

    Würdest du das noch ein wenig genauer erläutern, was du hiermit meinst? Vor allem mit dem Ausdruck 'string'. Ich hoffe, dass du damit im allgemeinen eine Zeichenkette meinst und nicht den std::string ?
    Und ob es in diesem Fall wirklich etwas völlig anderes ist, kann man schlecht beurteilen, da wir nicht wissen, was Skullyan mit dem Array machen will 😉

    Ich meinte in der Tat den std::string - ich nahm nämlich an, daß ein string.push_back(0) nicht das gleiche macht, wie ein vector.push_back(0). Allerdings habe ich gerade getestet, und muß zu meiner Überraschung erkennen, daß ich mich geirrt habe.

    string str;
    
    str.push_back(65);
    str.push_back(66);
    str.push_back(0);
    str.push_back(65);
    str.push_back(66);
    
    cout << "size of str: " << str.size() << endl;
    cout << str << endl;
    

    führt zu der Ausgabe:
    size of str: 5
    AB AB

    Ich hatte erwartet, daß 0 als Ende des Strings interpretiert wird. Möglicherweise kann man also 'string' genau so wie 'vector' benutzen, solange man 'char' verwalten will.


  • Administrator

    Belli schrieb:

    Ich hatte erwartet, daß 0 als Ende des Strings interpretiert wird. Möglicherweise kann man also 'string' genau so wie 'vector' benutzen, solange man 'char' verwalten will.

    0 hat in einem std::string überhaupt gar keine Bedeutung. Die Länge wird separat mitgeführt. Du musst halt einzig aufpassen, wenn du mit C Schnittstellen kommunizierst. Also wenn du über die Funktion c_str einen C String des std::string Objektes holst, dann hast du mehrere Nullen drin, was natürlich falsche Ergebnisse liefern kann.

    Genauso benutzen wie std::vector<char> , würde ich aber mit einer Warnung verbinden. std::string ist natürlich auf Zeichenketten Benutzung optimiert, während std::vector ein Container für Elemente irgendeines Typs ist. Auch gibt es keine Garantien, dass der Speicher von einer Zeichenkette in std::string an einem Stück sein muss, usw. usf.
    Es gibt einige Unterschiede zwischen std::string und std::vector , aber diese Unterschiede beziehen sich weniger auf die Elemente, welche sie halten, sondern sind ihre Funktionsweise an sich und ihren Einsatzzweck.

    Grüssli



  • Dravere schrieb:

    Auch gibt es keine Garantien, dass der Speicher von einer Zeichenkette in std::string an einem Stück sein muss, usw. usf.

    Ist das beim vector anders? Immerhin kann ich bei beiden die Elemente mit dem []-Operator ansprechen, ich hätte auch hier erwartet, daß die Elemente am Stück im Speicher zu finden sind, aber naja, Implementationsdetails sollen ja transparent sein.

    Daß es trotzdem Unterschiede zwischen vector<char> und string gibt, ist schon klar, auch, daß ich einen vector<char> nicht uneingeschränkt wie einen string nutzen kann, aber möglicherweise kann man einen string wie einen vector<char> benutzen?!

    Egal - Ausgangspunkt dieser Subdiskussion war ja meine Aussage, daß vector<char> etwas anderes ist als string, im Detail bin ich dazu zwar auf Grund falscher Annahmen gekommen, aber letztendlich scheint sie ja zu stimmen.

    Und daß man - wie Du weiter oben erwähnt hast - es natürlich vom konkreten Anwendungszweck abhängig machen muß, welchen Typ man benutzt, ist völlig unbestritten.



  • Dravere schrieb:
    Auch gibt es keine Garantien, dass der Speicher von einer Zeichenkette in std::string an einem Stück sein muss, usw. usf.

    Ist das beim vector anders?

    Ja, es ist beim std::vector garantiert dass der Speicher en- Block ist (seit dem Korrigendum 2003).

    Simon


Anmelden zum Antworten