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 ???
-
Um ein Array anzulegen nutzt man die eckigen Klammern
new char[size + 1];.
Was du machst, ist ein einzelnerchar-Wert auf dem Heap anzulegen und diesen mit dem Wertsize + 1zu initialisieren.Im übrigen solltest du globale Variablen vermeiden. Vielleicht einmal
std::stringin betracht ziehen. Und das Lesen von diesem Thread dürfte auch nicht schaden:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-111042.htmlGrüssli
-
new char [] ?
-
und (mal schon die klammern ersetzt):
hilfe = new char[size+1]; /* ... */ hilfe[size+1] = '\n'; //BUMMnew 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.