char * als Parameter



  • Hier ist eine Funktion mit der signatur: void foo(char * data);

    Welche sicheren Methoden gibt es, diesen data pointer bereitzustellen?

    Mir fallen nur zwei Wege ein: Wenn größe nicht bekannt, dann ein buffer wie char buf[255]; erzeugen. Wenn größe bekannt ist, mit new dynamisch alloziieren und danach löschen.
    Das wirkt allerdings noch so C, gibts da noch andere Wege?



  • Seikilos schrieb:

    Welche sicheren Methoden gibt es, diesen data pointer bereitzustellen?

    Was?



  • Gibt es andere Methoden, wie ich char * bereitstellen kann? Ich kann ja schlecht einen std::string auf eine bestimmte breite initialisieren, und einen zeiger auf das const char * des strings nehmen, const weg casten, et voila 😃



  • Ändert die Funktion an den Daten was? Wenn ja, woher weiss die Funktion, wie lang das übergebene Feld ist?



  • Ja, weiß sie



  • Tachyon schrieb:

    Ändert die Funktion an den Daten was? Wenn ja, woher weiss die Funktion, wie lang das übergebene Feld ist?

    Daher dass der char-Zeiger eine Länge hat? Bzw. irgendwann ja auf Null zeigt.



  • Seikilos schrieb:

    Ja, weiß sie

    Soll das eine Antwort auf eine meiner Fragen sein? Wenn ja, auf welche?



  • inflames2k schrieb:

    Tachyon schrieb:

    Ändert die Funktion an den Daten was? Wenn ja, woher weiss die Funktion, wie lang das übergebene Feld ist?

    Daher dass der char-Zeiger eine Länge hat? Bzw. irgendwann ja auf Null zeigt.

    Die länge des char-Zeigers hilft einem nochmal genau wie weiter, wenn sich dahinter ein Buffer verbirgt?
    Das es sich um 0-terminierte Daten handelt wurde nochmal genau wo gesagt?
    Es würde auch helfen zu wissen, was foo genau tut. Kann es die Daten verändern, oder liest es nur? Wenn die Daten verändert werden, kann sich dabei auch die Länge des Puffers ändern?



  • Ist ein Socket reader, vorher ist mir die Länge bekommt, ich kann also mit new einen buffer manuell reservieren, aber geht es auch ohne manuelle Speicher reservierung?



  • Seikilos schrieb:

    Ist ein Socket reader, vorher ist mir die Länge bekommt, ich kann also mit new einen buffer manuell reservieren, aber geht es auch ohne manuelle Speicher reservierung?

    So z.B.:

    std::vector<char> buffer;
    //...
    buffer.resize(getSizeFromSomewhere());
    //...
    foo(&buffer[0]);
    

Anmelden zum Antworten