Problem mit "Access violation reading location"

Tobias K.

Erfahrenes Mitglied
moin


Folgender Code macht mir gerade Probleme:
Code:
int ablauf(ifstream &datei, int *p, int *index)
{
	char zeichen;
	
	while(datei)
	{
		datei.get(zeichen);
		switch(zeichen)
		{
		case 'p': *index++; break;
		case 'm': *index--; break;
		case '+': p[*index]++; break;  //Hier meckert er rum
		case '-': p[*index]--; break;  //Und hier wird er dann wohl auch meckern
		}
	}

	return 0;
}


int main()
{
	int *index = 0;
	int p[1000];
	memset(p, 0, 1000);

	ifstream datei("C:\\Dokumente und Einstellungen\\Tobias\\Desktop\\hallo.xxx");

	ablauf(datei, p, index);

	cin.get();
	return 0;
}

Ja bei den gekennzeichneten Stellen bekomm ich den Fehler" Unhandled exception at 0x0041d43a in xxx.exe: 0xC0000005: Access violation reading location 0x00000004."

Auch die beiden Zeilen dadrüber sind merkwürdig, zuerst haben sie den Wert 0 was auch richtig ist, nach dem *index++ haben sie den Wert 4. Warum das?

Ich komm da grad nicht weiter....


mfg
umbrasaxum
 
Hy!

Das mit den 4 als Inhalt des Pointers ist klar: Das Inkrement hat eine höhere Bindung als der Derefenzierungsoperator. Der Pointer wird also um ein Element im Speicher "weitergeschoben". Da du einen Pointer auf int verwendes wird dieser um 4 Byte erhöht. 0->4. Die Zugriffsverletzung kommt daher, das du keine Rechte hast im RAM die Daten der Adresse 0x04 zu verändern, du dies aber mit dem Inkrement versuchst.

Hoffe ich hab jetzt keinen Blödsinn gesagt.

mfg
uhu01
 
moin


Ich hab jetzt am Anfang:
Code:
int zahl = 0;
int *index = &zahl;
Nun geht es.

Code:
int *index;
index = new int;
Funktioniert aber auch nicht.

Das mit der Zugriffsverletzung klingt allerdings sehr plausibel.


mfg
umbrasaxum
 
Das zweite geht nicht, weil int keinen Default-Constructor hat. Das new legt zwar ein neues int an, der Inhalt des ints ist aber nicht 0 (sondern bei Visual C++ vermutlich 0xcccccccc oder 0xcdcdcdcd).
Damit liest er dann über die 1000 von p drüber raus.

Falls ich falsch liege, habe ich das da oben gar nicht getippt.
 
Zurück