Anfaengerfrage
-
"xyz" ist vom Typ const char [4]. Der Inhalt ist {'x', 'y', 'z', '\0'}. Wenn du schreibst const char bla[3] = "xyz";, dann ist bla vom Typ const char [3] mit dem Inhalt {'x', 'y', 'z'}.
cout ist ein Objekt was ungefähr so funktioniert:
ostream &operator << (const char *s){ while (*s != '\0'){ gebeAus(*s); s++; } return *this; }Er gibt so lange die Zeichen aus bis er ein '\0'-Zeichen trifft. Da dein Array nicht mit einem '\0'-Zeichen endet gibt cout munter weiter irgendwelchen Speicher aus bis er zufällig eine '\0' findet oder das Betriebssystem dein Programm wegen einer Zugriffsverletzung abschießt.
Lösung: Das '\0'-Zeichen dran tun oder std::string benutzen oder cout sonst irgendwie sagen, dass er nur die ersten 3 Zeichen ausgeben soll oder sich freuen, dass komische Sachen ausgegeben werden.
-
nwp3 schrieb:
Wenn du schreibst const char bla[3] = "xyz";, dann ist bla vom Typ const char [3] mit dem Inhalt {'x', 'y', 'z'}.
Das sollte ill-formed sein. Ein Zeichenkettenliteral endet immer mit einem 0-Terminator, und damit liegen zuviele Initialisierer vor.
-
Boah...also der compiler macht alles richtig, indem er in bitch keine 3 buchstaben aufnehmen will??
-
vier
-
Er nimmt aber nicht mal drei, darum gehts doch.
-
Doch, da passen drei Zeichen rein. Wenn das letzte Zeichen kein '\0' ist, kannst du es aber nicht mit
coutüberprüfen, da das bei einem char* einen C-String erwartet.
-
Er nimmt noch nichtmal einen, er nimmt garkeinen, weil er die vier nicht nimmt, weil vier nicht in drei passen.
-
Ne guck doch mal auf die compilerwarnung in seite 1. Da steht doch dass 3 fuer ihn zu lang ist
-
Nee, steht da nicht!
-
Don't feed the troll.
-
Ok jetzt hab ichs..danke