Vector



  • Hallo, ist das richtig sowie ich den Vector hier in der Funktion benutze ?
    Der Vector kann hier nicht Überlaufen (Bufferoverflow) richtig ?

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int function (char * );
    int main(int argc, char* argv[])
    {
    
    vector<char>var(1);
    
    cout<<"Eingabe: ";
    cin.getline(&var[0] , 100 );
    
    function ( &var[0] );
    
    system("PAUSE");
    }
    //---------------------------------------------------------------------------
    
    int function (char *s )
    {
            cout<<"Ausgabe aus Vector: " << s <<endl <<endl;
    
    return 0;
    }
    


  • Deine Verwendung ist komplett falsch. Also so richtig. Falscher als falsch. Woher soll denn der std::vector wissen, dass du 100 Byte einlesen willst?

    Was du hier machst ist grob undefiniertes Verhalten. Außerdem ist deine Art des Einlesens fragwürdig. Die Diskussionen über endl und system() will ich erst gar nicht anfangen.



  • ein bufferoverflow ist wenn der zahlenbereich eines datentyps nicht ausreichend für deine zahlen ist. sprich wenn du versuchst z.b. 12633274234 n 8bit (max 255) zu quetschen...

    was du hier machst, ist was anderes. du sprichst vermutlich von array indexierungen und den damit verbundenen fehlern wie ausserhalb eines arrays schreiben und lesen.
    der vector gibt dir ein paar hilfen damit sowas nicht oder nur schwer passiert und man es dann doch findet.

    aber genau das umgehst du alles schön indem du mit zeigern rummischst...

    und in deinem beispiel kracht es sofort:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int function (char * );
    int main(int argc, char* argv[])
    {
    
    vector<char>var(1); // du reservierst speicher für einen char, nicht für 100 wie du gleich brauchen könntest
    
    cout<<"Eingabe: ";
    cin.getline(&var[0] , 100 ); // hier wird es sofort krachen, da eben zu wenig speicher bereitgestellt ist
    
    function ( &var[0] ); // hier greifst du auf interne member des vectors zu, wenn du das jetzt deletes krachts später wieder. lass das mal alles sorge des vectors sein
    
    system("PAUSE");
    }
    //---------------------------------------------------------------------------
    int function (char *s )
    {
            cout<<"Ausgabe aus Vector: " << s <<endl <<endl; // du willst hier einenchar* string ausgeben. cout erwartet aber, dass solch ein char* string mit einer 0 terminiert ist. und das ist es beim vector nicht...
    
    return 0;
    }
    

    es gibt eine einfache lösung:
    1.- nimm std::string
    2.- nimm getline(cin, std::string)
    3.- lass den pointerscheiss wech



  • Also abgestürtzt ist das Programm bei mir nicht.

    Aber wie macht man es denn dann richtig mit dem Vector, ich weiss das ich std::string benutzen kann aber mich interessiert der Vector kram auch.



  • memo ry schrieb:

    Aber wie macht man es denn dann richtig mit dem Vector

    Indem man ihn für die Dinge benutzt, für die er geeignet und gedacht ist. Für chars ist nunmal std::string in den meisten Fällen der bessere Kandidat.

    Was willst du überhaupt erreichen?



  • Reines Glück - undefiniertes Verhalten eben.
    Wenn du was mit vector üben willst, dann bitte was sinnvolles. Lies 10 Zahlen ein und berechne die Summe oder so.



  • Wenn du unbedingt einen vector<> verwenden willst, dann laufen solche Spielereien unter "auf eigene Gefahr". Der Zugriff auf den Vector-Inhalt über einen nackten Zeiger (&v[0] bzw. &v.front()) umgeht dessen eigene Speicherverwaltung, da mußt du vorher genug Platz zur Verfügung gestellt haben. Und auch wenn du es geschafft hast, 100 Zeichen in den Speicher zu beamen, geht der vector<> immer noch davon aus, daß er nur ein Element enthält - möglicherweise hat er prophilaktisch vorsorglich mehr Platz reserviert, aber bei der Größe hast du ziemlich sicher den verfügbaren Platz überstrapaziert. Das Resultat muß nicht unbedingt sofort zum Absturz führen, sondern liefert mitunter subtilere Fehler, die erst dann bemerkbar werden, wenn du den Code in einen größeren Kontext setzt.

    PS: Ich schließe mich Skym0sh0 an - verwende für jedes Problem das richtige Werkzeug. Und vector<char> ist nunmal keie vollwertige String-Klasse.



  • Skym0sh0 schrieb:

    ein bufferoverflow ist wenn der zahlenbereich eines datentyps nicht ausreichend für deine zahlen ist. sprich wenn du versuchst z.b. 12633274234 n 8bit (max 255) zu quetschen...

    Das ist ein Integer-Overflow. Hier ist es ein Bufferoverflow, da ein Buffer (das Array) über die Grenzen hinaus beschrieben wird.

    Zum Thema: wie man es mit vector machen könnte:

    vector<char> v;
    char c;
    while(cin >> c && c != '\n')
        v.push_back(c);
    

    std::getline macht genau das selbe, nur vermutlich effizienter und mit string .


Anmelden zum Antworten