debug crash
-
Ich hab so ein komischen Fehler für ein eigentlich zu einfaches Programm bekommen. Da ich mit dem debugger noch keine Erfahrung habe frage ich einfach mal hier. bei der Deklaration der chars, bekomme ich einen Stackoverflow, aber der tritt erst nach dem ersten getchar auf...
Leider ist das ganze beim debuggen abgeschmiert, aber ein screenshot konnte ich noch bekommen.
http://www.foopics.com/showfull/01c7d12ac4c51846e25d6ca376501c08
Mir scheint da will MSVC einfach nicht. Kann jemand einen Fehler im Code erkennen?
-
vector schrieb:
Leider ist das ganze beim debuggen abgeschmiert, ohne dass ich es speichern konnte, aber ein screenshot konnte ich noch bekommen.
Dein Compiler debuggt, ohne dass die Quellen gespeichert sind?
Hast du überhaupt 1M Platz auf dem Stack?
-
wo ist denn der stack? ich dachte ich arbeite auf dem Arbeitsspeicher.
gespeichert ist es, leider, aber, wie man sehen kann, stand da schon mal mehr und die undo-history ist geschichte. macht msvc eigentlich sicherungskopien und wo würde man die finden?
-
vector schrieb:
wo ist denn der stack?
Das sag ich dir, wenn du mir die erste Frage beantwortest.
vector schrieb:
ich dachte ich arbeite auf dem Arbeitsspeicher.
Ja klar, aber es könnte trotzdem helfen, einen anderen Speicherbereich einzunehmen. Versuch mal so:
char *p = malloc(512000); ... free(p);
-
also, gespeichert hatte ich aus gewohnheit, weil die meisten programme das halt sowieso verlangen, aber ich konnte nicht richtig beenden. hab ich mich richtig klug angestellt, anstatt einfach alles überflüsige weg zu kommentieren.
jetzt wo du das so erwähnst kann ich mich dunkel an diesen Unterschied erinnern, aber wundere mich immer noch was der unterschied zwischen *c und c[] ist. jedenfalls funktioniert deine variante, nur darf ich jetzt alles nochmal schreiben. der stack ist also irgenwo im prozessor, vllt im cache?
wieso free()? der speicher wird beim beenden wieder freigegeben, würde ich mal so sagen.
-
vector schrieb:
wieso free()? der speicher wird beim beenden wieder freigegeben, würde ich mal so sagen.
Grundsätzlich übernimmt das Betriebssystem das, ja. Trotzdem ist das kein guter Stil, da es nur nach Anwendungsende vom OS übernommen werden kann - ziehst du also in einer Schleife Speicher und gibst ihn nicht wieder frei, dann ist irgendwann Schluss. Also zu jedem malloc ein passendes free und alles ist schön.
-
wo ist er nu, der stack
das wars dann heut für mich
danke und gute nacht
-
vector schrieb:
also, gespeichert hatte ich aus gewohnheit, weil die meisten programme das halt sowieso verlangen, aber ich konnte nicht richtig beenden.
Warum postest du dann nicht einfach den Code?
vector schrieb:
der stack ist also irgenwo im prozessor, vllt im cache?
http://en.wikipedia.org/wiki/Stack-based_memory_allocation
vector schrieb:
jetzt wo du das so erwähnst kann ich mich dunkel an diesen Unterschied erinnern, aber wundere mich immer noch was der unterschied zwischen *c und c[] ist.
char *c
ist ein Zeiger auf ein Zeichen.char c[10]
ist ein Array von zehn Zeichen. Wenn ein Ausdruck mit den [] auftaucht, wird er meistens so ausgewertet:c[10] // wird ausgewertet als wäre es *(c + 10)
Das geht deshalb, weil die Elemente eines Arrays im Speicher nacheinander angeordnet werden, und weil man zu einem Zeiger Zahlen addieren darf, um auf das folgende Element des gleichen Typs im Speicher zuzugreifen.
-
mngbd schrieb:
vector schrieb:
also, gespeichert hatte ich aus gewohnheit, weil die meisten programme das halt sowieso verlangen, aber ich konnte nicht richtig beenden.
Warum postest du dann nicht einfach den Code?
weil dann die debug info verloren gewesen wär, ich hätts aber trotzdem machen sollen
-
vector schrieb:
weil dann die debug info verloren gewesen wär, ich hätts aber trotzdem machen sollen
Warum geht dir Information verloren, wenn du sie hierher kopierst?
-
uiouio schrieb:
wieso free()? der speicher wird beim beenden wieder freigegeben, würde ich mal so sagen.
Weil's so im Standard steht. Grundsätzlich übernimmt das Betriebssystem das nicht, obwohl einige das gern tun, weil sie es nicht mögen, wenn ihnen der Speicher ausgeht, nur weil ein Programmierer eine Zeile vergessen hat.
ich schrieb:
nur darf ich jetzt alles nochmal schreiben
Mal ganz im Ernst: alle Compiler, die ich kenne, speichern die Quelldateien sowieso ab, bevor sie mit dem Compilen beginnen, und Compilen vor dem Debuggen sie müssen. Jede Wette, dass der Quelltext noch in dem Dateisystem herumliegt, wenn du ihn nicht selbst gelöscht hast.
-
mngbd schrieb:
Mal ganz im Ernst: alle Compiler, die ich kenne, speichern die Quelldateien sowieso ab, bevor sie mit dem Compilen beginnen
du meinst sicherlich "alle IDEs, die ich kenne, ....", denn Compiler speichern sicherlich nicht den Quellcode.
-
supertux schrieb:
du meinst sicherlich "alle IDEs, die ich kenne, ....", denn Compiler speichern sicherlich nicht den Quellcode.
Ja.