Endlosschleife, wann geht der Speicher aus und welcher?
-
Hallo Leute,
habe da so ein kleines Programm geschrieben:
#include <stdio.h> static int cnt=0; void test() { int i=cnt++; if(i==200000) printf("%d \n",i); else test(); } int main() { test(); return(0); }
Der Code endet mit der Zeit in einer Seg.Fault.
Nun gibt man für cnt=20000 ein und das Programm läuft durch.
Was geht dem Programm dann aus?
Ist es der Stackspeicher der nicht weiter wachsen kann oder ist es der virtuelle
Speicher?
Mit dem Befehl ulimit -a [LINUX] sieht man die Begrenzungen im Speicher.
Mittels valgrind und ddd habe ich es auch schon versucht, komme jedoch nicht darauf.
Kann mir bitte einer helfen.
Oder gibt es da einen Trick wie ich den Stack mitloggen kann bzw. den virtuellen
Speicher?LG
Luis
-
gcc kann Endrekursionen optimieren.
-
knivil schrieb:
gcc kann Endrekursionen optimieren.
Gut aber das hilft mir leider nicht beim Verständnis für Programme weiter.
LG
Luis
-
Dir geht der Stack aus.
Der wird mit Rücksprungadressen und dem lokalen i belegt (wenn nicht wegoptimiert).Bei 20000 wird allerdings nur das printf gemacht, danach wird die Funktion beendet und die Rekursion löst sich auf.
void test() { int i=cnt++; if(i==200000) printf("%d \n",i); else test(); printf(" %d", i); }
-
DirkB schrieb:
Dir geht der Stack aus.
Der wird mit Rücksprungadressen und dem lokalen i belegt (wenn nicht wegoptimiert).Dank dir. Habe soeben das Softlimit für den Stack erhöht und siehe da es funktioniert. Somit kann ich defintiv sagen der Stack wächst zu stark an.
Gibt es hier ein Tool das den Resourcenverbrauch von Programmen schön anzeigt?
Meine nicht so wie top, sondern etwas besseres genaueres z.b. wie man sieht wie
der Stack sich verhält?LG
Luis