Access violation reading location mit cout
-
Hallo,
neues Problem, das bei mir für Unverständnis sorgt
srand ( time(NULL) ); int zahl = 0; for(int i=0; i < 10; i++) { zahl = rand(); cout << zahl+"\n" << endl; }
Daraufhin fliegt jedesmal eine Exception: "Access violation reading location"
und es erscheinen skurile Ausgaben auf der Konsole.
Mit printf funktioniert das übrigens ohne Probleme, aber printf benutze ich jetzt nicht mehrWas mache ich jetzt falsch?
-
das cout << zahl+"\n" << endl;
ist falsch.int und string können so nicht verkettet werden.
-
Wie kommst du darauf, den
operator+
für das Zusammenhängen von Strings benutzen zu können?Nimm dafür den Stream-Operator
<<
. Das was du machst, ist nämlich zu einem Zeiger einenint
-Offset zu addieren (Zeigerarithmetik). Die resultierende Adresse gehört nicht dir, und Zugriff darauf führt zu undefiniertem Verhalten.
-
Nexus schrieb:
Wie kommst du darauf, den
operator+
für das Zusammenhängen von Strings benutzen zu können?Java
- Das steckt so tief in mir drin^^
Nimm dafür den Stream-Operator <<
for(int i=0; i < 10; i++) { zahl = rand(); //folge[i] = zahl; //printf("%d\n",zahl); string s = "Ergebnis: "; cout << s << zahl << endl; }
So gut? Zumindest funktioniert es jetzt.
-
PeterFragt schrieb:
Java
- Das steckt so tief in mir drin^^
Habe ich fast gedacht. Aber gewöhn dir gleich an, dein Wissen von Java zu verdrängen, während du C++ programmierst. Versuche auch nicht, bekannte Herangehensweisen 1:1 auf C++ zu übertragen, hier werden so viele Dinge anders gelöst.
PeterFragt schrieb:
So gut? Zumindest funktioniert es jetzt.
Ja, so gut. Aber du kannst das Stringliteral natürlich auch direkt bei
std::cout
einsetzen, damit sparst du dir die Konstruktion eines unnötigenstd::string
s:std::cout << "Ergebnis: " << zahl << std::endl;
Aber falls du doch einmal Stringliterale speichern musst, reicht
const char*
völlig, da brauchst du die dynamischen Eigenschaften vonstd::string
nicht.
-
danke erstmal!
-
Nexus schrieb:
.. Die resultierende Adresse gehört nicht dir, ...
bei mir funzt das auch nicht, obwohl die adresse mir gehört.
glaubste nicht? hab noch die quittung vom ram.