Stack Overflow beim Start des Programmes



  • Mein Problem ist folgendes:
    Ich hab ein Programm geschrieben mit VC++2010 das bis zur letzten kleinen Änderung noch funktioniert hat und jetzt vor der Ausführung (meiner) ersten Programm Zeile folgenden Fehler wirft:
    "Unbehandelte Ausnahme bei 0x00288737 in FreierFall.exe: 0xC00000FD: Stack overflow."
    er tritt in der Datei "chkstk.asm" auf und ist reproduzierbar.

    und falls es jemandem hilft:

    // FreierFall.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {//nach dieser "Anweisung" tritt der fehler auf
    	if(argc<8)//bis hier kommt das programm nicht mehr
    	{
    		cout << "Aufruf:\t Dateiname Genauigkeit dt g m A ro c "<< endl<<flush;
    		return -2;
    	}
    

    meine Vermutung ist das es ein probelm des compiler ist,habe aber selber fast keine Erfahrung mit C++ um es beheben zu können.

    schon mal Danke im voraus



  • Hi,

    mach mal ein Rebuild (rechter Klick auf das Projekt -> Rebuild).
    flush ist nebenbei überflüssig - macht endl schon.
    Und die fehlende }-Klammer hast du wohl nur hier vergessen oder?



  • Die Klammer hab ich nicht vergessen sonder einfach den Rest des Quelltextes weggelassen (der gesamte Code ist fast 100 Zeilen).

    Ein Rebuild hilft auch nichts.
    Auch nicht wenn ich denn Quellcode zur letzten funktionierenden Version zurückändere.



  • Dann änder doch mal den Quelltext zu genau dem den du hier gepostet hast.



  • Wenn ich den Rest des programmes Ausklammere geht es komischer weise.



  • Na sowas 😮

    Dann klammer jetzt mal eine Zeile nach der anderen wieder ein und guck wann es nicht mehr geht.



  • Dann rufst du wahrscheinlich main im Code auf?
    Nicht machen, niemals.



  • Nein ich habe keine rekursion im Quelltext.
    Das Problem war das ich ein viel zu großese Array angelegt habe.
    Ich bin allerdings nicht darauf gekommen das es an dem Array liegt da es erst viel später deklariert/definiert wird;



  • Kevin9410 schrieb:

    Ich bin allerdings nicht darauf gekommen das es an dem Array liegt da es erst viel später deklariert/definiert wird;

    Der Compiler darf vieles an anderer Stelle machen als es im Quelltext steht. z.B. darf er (oder muss häufig) den Speicher für alle in einer Funktion definierten Variablen gleich zu Beginn der Funktion reservieren. Also auch für dein Array, so dass du den OVerflow erhälst, lange bevor dein Debugger bei der Deklaration des Arrays angelangt ist.



  • pumuckl schrieb:

    Kevin9410 schrieb:

    Ich bin allerdings nicht darauf gekommen das es an dem Array liegt da es erst viel später deklariert/definiert wird;

    Der Compiler darf vieles an anderer Stelle machen als es im Quelltext steht. z.B. darf er (oder muss häufig) den Speicher für alle in einer Funktion definierten Variablen gleich zu Beginn der Funktion reservieren. Also auch für dein Array, so dass du den OVerflow erhälst, lange bevor dein Debugger bei der Deklaration des Arrays angelangt ist.

    Weswegen muss er den Speicher häufig gleich zu Beginn reservieren?
    Also bezüglich Gültigkeitsbereichen von Variablen sehe ich (auf den ersten Blick)
    keine Notwendigkeit dazu...



  • XSpille schrieb:

    Weswegen muss er den Speicher häufig gleich zu Beginn reservieren?
    Also bezüglich Gültigkeitsbereichen von Variablen sehe ich (auf den ersten Blick)
    keine Notwendigkeit dazu...

    Dabei gehts nicht um die rein sprachtechnischen Gültigkeitsbereiche, sondern um die Maschinensprache, die der Compiler draus macht. Im "normalen" Fall (kann sich evtl. durch Optimierungen etwas ändern) wird beim Betreten einer Funktion ein sogenannter Stackframe auf dem Stack reserviert, der Platz für die Argumente und alle in der Funktion lokal verwendeten Variablen enthält. Wird aus der Funktion heraus eine neue Funktion aufgerufen, kommt der Stackframe für die neue Funktion oben drauf usw.

    Wie gesagt, es ist sicherlich durch Optimierungen möglich, dass da grade bei solch großen Strukturen wie sie hier offenbar vorgekommen sind nicht unbedingt beim Betreten der Funktion gleich alles reserviert wird und die Funktion quasi auf mehrere Stackframes aufgeteilt wird, aber ich gehe mal davon aus, dass der OP im Debugmodus kompiliert hat, wo alles eher "klassisch" abläuft.



  • pumuckl schrieb:

    XSpille schrieb:

    Weswegen muss er den Speicher häufig gleich zu Beginn reservieren?
    Also bezüglich Gültigkeitsbereichen von Variablen sehe ich (auf den ersten Blick)
    keine Notwendigkeit dazu...

    Dabei gehts nicht um die rein sprachtechnischen Gültigkeitsbereiche, sondern um die Maschinensprache, die der Compiler draus macht. Im "normalen" Fall (kann sich evtl. durch Optimierungen etwas ändern) wird beim Betreten einer Funktion ein sogenannter Stackframe auf dem Stack reserviert, der Platz für die Argumente und alle in der Funktion lokal verwendeten Variablen enthält. Wird aus der Funktion heraus eine neue Funktion aufgerufen, kommt der Stackframe für die neue Funktion oben drauf usw.

    Wie gesagt, es ist sicherlich durch Optimierungen möglich, dass da grade bei solch großen Strukturen wie sie hier offenbar vorgekommen sind nicht unbedingt beim Betreten der Funktion gleich alles reserviert wird und die Funktion quasi auf mehrere Stackframes aufgeteilt wird, aber ich gehe mal davon aus, dass der OP im Debugmodus kompiliert hat, wo alles eher "klassisch" abläuft.

    Hi pumuckl,

    ich habe eine (ungefähre) Vorstellung wie es in der Maschinensprache aussieht.
    Ich habe auch schonmal etwas Assembler geproggt. Leider erkenne ich
    bisher noch keinen Vorteil...
    Ich lass es mir aber nochmal in Ruhe durch den Kopf gehen...

    Gruß und DANKE,
    XSpille


Anmelden zum Antworten