new char problem



  • Ich kriege im folgenden Programm ein unerwartetes Ergebnis:

    #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    #include <tchar.h>
    #include <string>
    using namespace std;
    
    LPCTSTR text = _T("testtest");
    char* hilfe;
    
    int main(int argc, char *argv[])
    {
    
        cout << text; // Ausgabe: testtest
    
        int size = strlen(text);
        cout << " " << size; // Ausgabe: 8
    
        hilfe = new char(size+1);
        cout << " " << strlen(hilfe) << "\n"; // Ausgabe: 3 (???)
    
        for(int i=0; i< size; i++){hilfe[i] = text[i]; cout << "\n" << i << ":"<< hilfe[i];} // Ausgabe: 0: t 1: e ... ist korrekt
    
        hilfe[size+1] = '\0';
    
        cout << "\n\n" << hilfe; // Ausgabe: testtest plus i.welcher zeichen..
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Ich habe schon überlegt, ob eventuell bei "new char()" etwas schief läuft, oder ob es später einen Überlauf von "hilfe" gibt.

    Warum überhaupt strlen(hilfe): 3 ???


  • Administrator

    Um ein Array anzulegen nutzt man die eckigen Klammern new char[size + 1]; .
    Was du machst, ist ein einzelner char -Wert auf dem Heap anzulegen und diesen mit dem Wert size + 1 zu initialisieren.

    Im übrigen solltest du globale Variablen vermeiden. Vielleicht einmal std::string in betracht ziehen. Und das Lesen von diesem Thread dürfte auch nicht schaden:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-111042.html

    Grüssli



  • new char [] ?



  • und (mal schon die klammern ersetzt):

    hilfe = new char[size+1];
    /*
        ...
    */
        hilfe[size+1] = '\n'; //BUMM
    

    new char[size+1]
    -> 0...size
    size+1 ist eins dahinter - erzeugt undefiniertes verhalten 😉

    bb



  • das system("pause") ist erstmal zweitrangig, werds mir aber merken. 🙂

    ich bekomme selbst mit eckigen Klammern die selbe Ausgabe..
    ich hatte ja zuvor eckige, weswegen ich dann runde probiert habe.



  • EDIT:
    oooops, ich hab garnicht gemerkt, dass ich statt hilfe[size+1] = '\n' statt '\0' hatte..

    jetzt gehts mit hilfe[size] = '\0'.
    hab mich schon gewundert eh. 😃


Anmelden zum Antworten