Die Überschrift sagt so hoffe ich schon alles. Ich habe bisher mit Assembler gearbeitet und da musste man immer 100% aufpassen das man immer richtig die Unterprogramme verlässt und auch das man alles was man auf den Stack legt wieder runter holt. Besteht dieses Problematik bei C auch? Wenn ja wie muss ein Programm welches sich selbst aufruft ausschauen damit es keinen Stackoverflow gibt? Wie kann dieses Programm veranlassen das es sich selber verlässt und zu einem Programm welches z.B. dieses Programm neustartet springen?
Michael Dierken schrieb: > Die Überschrift sagt so hoffe ich schon alles. > > Ich habe bisher mit Assembler gearbeitet und da musste man immer 100% > aufpassen das man immer richtig die Unterprogramme verlässt und auch das > man alles was man auf den Stack legt wieder runter holt. > > Besteht dieses Problematik bei C auch? In genau derselben Problematik gibt es das in C nicht. Der COmpiler führt BUch darüber wieviel er beim Betreten einer Funktion gepusht hat und holt wieder alles vom Stack. > Wenn ja wie muss ein Programm welches sich selbst aufruft ausschauen > damit es keinen Stackoverflow gibt? Das kann das ganz von alleine > Wie kann dieses Programm veranlassen das es sich selber verlässt und zu > einem Programm welches z.B. dieses Programm neustartet springen? Falscher Ansatz. Dein C Programm besteht nicht aus Programmen, sondern aus Funktionen. Auf deinem µC läuft nur 1 Programm.
>Besteht dieses Problematik bei C auch? Ja. >Wenn ja wie muss ein Programm welches sich selbst aufruft ausschauen >damit es keinen Stackoverflow gibt? Genau wie das entsprechende Assemblerprogramm. Du schreibst es ja selbst: >100% aufpassen das man immer richtig die Unterprogramme verlässt und auch >das man alles was man auf den Stack legt wieder runter holt. Siehe auch: Rekursion (z.B. Fibionacci -> Rekursionsabbruch) >Wie kann dieses Programm veranlassen das es sich selber verlässt und zu >einem Programm welches z.B. dieses Programm neustartet springen? Funktion exit aufrufen. Das fragliche Programm durch ein weiteres Programm aufrufen lassen. In diesem übergeordneten Programm das untergeordnete wieder aufrufen.
Michael Dierken schrieb: > Besteht dieses Problematik bei C auch? Nein. Das macht der Compiler. In C räumt die aufrufende Funktion den Stack auf. Die weiß auch am besten, wieviel Paramter sie auf den Stack gepackt hat. Und alle lokalen Variablen landen auch auf dem Stack. Michael Dierken schrieb: > Wenn ja wie muss ein Programm welches sich selbst aufruft ausschauen > damit es keinen Stackoverflow gibt? Den Stack groß genug machen :-)
DirkB schrieb: > Das macht der Compiler. Dann mußt du nur noch den Nachweis führen, daß die Aufruftiefe geeignet beschränkt ist.
Bedenke: lokale Variablen einer Funktion liegen auf dem Stack => Arrays (Strings!) wachsen entgegen. Sprich wenn Du ein zu großes Element eines Arrays überschreibst, überschreibst Du Stackinhalte, zum Beispiel Deine Rücksprungadresse.
Martin schrieb: > DirkB schrieb: >> Das macht der Compiler. > > Dann mußt du nur noch den Nachweis führen, daß die Aufruftiefe geeignet > beschränkt ist. Die Antwort bezog sich auf den Teil der Frage, ob der Programmierer sich um die Stackbereinigung kümmern muss. Auch wenn ich den Teil mit Nein beantwortet habe, bleibt das Problem des Stacküberlaufs.
Was meinst Du mit Stackbereinigung? Alles was der Compiler auf dem Stack alloziert gibt er auch wieder frei. Sonst macht der da nichts. C ist nicht viel mehr als ein Makroassembler. C macht nur sehr wenig selbst.
Christian Berger schrieb: > Was meinst Du mit Stackbereinigung? Alles was der Compiler auf dem Stack > alloziert gibt er auch wieder frei. Sonst macht der da nichts. Das reicht doch schon. Das ist mehr als bei Assembler. > C ist nicht viel mehr als ein Makroassembler. C macht nur sehr wenig > selbst. Darum mögen wir ja auch C so gerne.
Christian Berger schrieb: > Was meinst Du mit Stackbereinigung? Alles was der Compiler auf dem Stack > alloziert gibt er auch wieder frei. Ja eben. Genau darum ging es doch in der Frage.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.