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 mehr 😃

    Was 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 einen int -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ötigen std::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 von std::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.


Log in to reply