Access Violation --> Warum?
Insanity
- programmiertechnik
Hi alle zusammen,
ich weiß das dies hier ein Webentwicklungsforum ist, aber da ich bisher auf jede Frage hier ne Antwort bekommen habe versuch ichs halt wieder hier:
Ich hab mich mal wieder an einem c++-Programm versucht (WIN32) auch noch :).
Mein Problem ist folgendes, wenn ich das Programm compile also VC++ 6
STRG+F5 gibts kein Problem :) Aber wenn ich per F5 den Debugger anschmeisse hagelts Access Violations.
Der Kontext ist folgender:
Konstruktor einer Klasse bekommt Pointer auf Chars übergeben,
jetzt soll er die Anzahl der vorhandenen Chars zählen und per
new neuen Speicher im Heap freimachen. Bei dieser Zählaktion gibts dann den ersten fehler:
int count(char * pszChar)
{
int i = 0;
while(pszChar[i++])
return i;
}
Er soll also solange i erhöhen, solange er Elemente im Array hat.
und dann i zurückgeben. Es klappt ja auch nur der debugger wirft mit Alarmmeldungen. Hat jemand vielleicht ne Erklärung dafür? Wäre für jeden Ansatz dankbar.
Greetz Insanity
Moin Insanity,
nur keine falsche Scham wegen des Topics - wozu haben wir schließlich das Thema Programmiertechnik.
Ich hab mich mal wieder an einem c++-Programm versucht (WIN32) auch noch :).
Nichts gegen Win32 - aber C++ mag ich eigentlich nicht...
STRG+F5 gibts kein Problem :) Aber wenn ich per F5 den Debugger anschmeisse hagelts Access Violations.
Was ist, wenn du das compilierte Programm außerhalb der IDE startest? Gibt's dann die gleichen Fehlermeldungen?
Hast du's schon mal im Einzelschrittmodus versucht?
int count(char * pszChar)
{
int i = 0;
while(pszChar[i++])
return i;
}
Erste Anmerkung: Wer ruft diesen Konstruktor auf, und welchen Wert hat dein pszChar zum Zeitpunkt des Aufrufs? Zeigt der auf sinnvolle Speicherinhalte oder irgendwo in die Wüste?
Zweite Anmerkung: Hinter dem while-Statement fehlt entweder ein Semikolon oder ein leerer Klammerpaar {}. So wie du es hier wiedergibst (also mit dem return als erste Anweisung nach dem while) wird die Funktion in jedem Fall sofort wieder verlassen, und zwar entweder mit dem return-Wert 1 oder mit einem undefinierten Rückgabewert, wenn pszChar zufällig auf ein Nullbyte zeigen sollte. Und undefinierte, d.h. zufällige Werte sind immer heikel, wenn man damit im Programm weiterarbeitet!
Versuch's also einfach mal mit einem leeren Block {} hinter dem while() - das könnte schon viel helfen!
Good luck,
Martin
Hi!
nur keine falsche Scham wegen des Topics - wozu haben wir schließlich das Thema Programmiertechnik.
Naja, unter Programmiertechnik werden eigentlich Fragen nach generellen Konzepten gestellt, nicht nach bestimmten Programmiersprachen. Aber egal.
Ich hab mich mal wieder an einem c++-Programm versucht (WIN32) auch noch :).
Nichts gegen Win32 - aber C++ mag ich eigentlich nicht...
Nichts gegen C++, aber Win32 mag ich eigentlich nicht... ;-)
Hast du's schon mal im Einzelschrittmodus versucht?
Das waere in der Tat die richtige Masznahme.
int count(char * pszChar)
{
int i = 0;
while(pszChar[i++])
return i;
}
Erste Anmerkung: Wer ruft diesen Konstruktor auf, und welchen Wert hat dein pszChar zum Zeitpunkt des Aufrufs? Zeigt der auf sinnvolle Speicherinhalte oder irgendwo in die Wüste?
Ja, man sollte vielleicht am Anfang auf NULL pruefen.
Zweite Anmerkung: Hinter dem while-Statement fehlt entweder ein Semikolon oder ein leerer Klammerpaar {}. So wie du es hier wiedergibst (also mit dem return als erste Anweisung nach dem while) wird die Funktion in jedem Fall sofort wieder verlassen, und zwar entweder mit dem return-Wert 1 oder mit einem undefinierten Rückgabewert, wenn pszChar zufällig auf ein Nullbyte zeigen sollte. Und undefinierte, d.h. zufällige Werte sind immer heikel, wenn man damit im Programm weiterarbeitet!
Vielleicht hat er das Semikolon nur beim Schreiben hier vergessen, weil er aus irgendeinem Grund nicht Copy&Paste gemacht hat. Dann wuerde das ganze weitgehend funktionieren, nur dass er immer eins zu weit zaehlt (i wird noch erhoeht, nachdem das Zero-Byte gefunden wurde). Wenn er den um 1 zu hohen Rueckgabewert weiterverwendet, ueberschreibt er vielleicht irgendwo ein Byte. Das faellt zur Laufzeit oft nicht auf, aber ich koennte mir vorstellen, das es der Debugger merkt. Daher also vielleicht das unterschiedliche Verhalten mit/ohne Debuggerkontrolle.
Falls das so ist, wuerde helfen:
while (pszChar[i]) i++;
Aber er koennte auch einfach strlen(pszChar) nehmen und die ganze Funktion einsparen. Das mal so als kleiner Wink mit dem Gartenzaun.
So long