.exe funktioniert nicht mehr



  • Hallo zusammen,

    ich bin grade neu hier und fange grade an C zu lernen.
    Hab ein Programm geschrieben, das einfach nur eine For-Schleife laufen lässt und steigende Zahlen ausgibt.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int i;
        int zahlen[600000];
    
        for(i = 0; i<600000; i++)
        {
            zahlen[i] = i+1;
            printf("Zahl: %d\n", zahlen[i]);
        }
    
        return 0;
    }
    

    Bei 500.000 Schleifen-Durchläufen geht noch alles wunderbar.
    Aber wenn ich beispielsweise 600.000 Schleifen-Durchläufe haben möchte, dann stürzt das Programm direkt zu Beginn ab. Und es kommt eine Meldung, dass die .exe nicht mehr funktioniert.

    Aber warum ist das so?

    Gruß
    Timmi



  • Deswegen:

    int zahlen[600000];
    

    Der Stack ist ein schlechter Ort für diese Datenmengen.

    #include <vector>
    
    int main()
    {
      std::vector<int> zahlen(600000);
      ....
    }
    


  • Sorry, ich habe gerade erst gesehen, dass dies das C-Unterforum ist.
    Es gilt aber immer noch das Gleiche, in C müsstest du nur selber malloc und free nutzen.



  • Zeile 11:

    zahlen[i] = i;
    

    ,denn da inkrementierst du ein zweites mal.
    Wozu überhaupt die Zahlen speichern? Gib doch einfach i aus.

    @sorry falsches subforum:
    Wozu sollte er malloc brauchen wenn er ein array benutzt?
    Das ist Quatsch.



  • EOP schrieb:

    @sorry falsches subforum:
    Wozu sollte er malloc brauchen wenn er ein array benutzt?

    Darum:

    vector victor schrieb:

    Der Stack ist ein schlechter Ort für diese Datenmengen.



  • EOP schrieb:

    Zeile 11:

    zahlen[i] = i;
    

    ,denn da inkrementierst du ein zweites mal.

    Quatsch!



  • EOP schrieb:

    ,denn da inkrementierst du ein zweites mal.

    Nein, tut er nicht. Er addiert nur +1 auf den Wert, der gespeichert werden soll, aber das verändert i nicht.

    Wir können wohl froh sein, dass du nach eigener Aussage a.D. bist; gezwungen zu sein, dir hinterherzuräumen, stelle ich mir unangenehm vor.

    EOP schrieb:

    Wozu überhaupt die Zahlen speichern? Gib doch einfach i aus.

    Dass es ein Beispiel ist, um das beschriebene Verhalten zu produzieren, muss man dir echt noch sagen? Ernsthaft jetzt?

    EOP schrieb:

    Wozu sollte er malloc brauchen wenn er ein array benutzt?
    Das ist Quatsch.

    Sei einfach ruhig.

    @OP: Allgemein gesprochen lässt man Stacks eher klein. Auf 64-Bit-Systemen mit viel Speicher kann man in der Regel dem Linker sagen, dass er den Stack schön ordentlich groß machen kann, aber auf kleineren Maschinen (Controllern oder dergleichen) ist die Speicherverwaltung grundlegend anders als auf Desktop-Computern. Da willst du die Stacks deiner Tasks möglichst kleinhalten und alles auf den Heap legen lassen.

    Auf der anderen Seite ist der Stack in der Regel schneller als der Heap. Speicher kann schnell reserviert und wieder freigegeben werden, für Multi-Threading-Anwendungen müssen keine Locks verwendet werden (beim Heap wird in der Regel eine verkette Liste von Chunks verwaltet, die gelockt werden muss). Ein malloc -Call kann dir gut den Cache kaputtmachen.

    Wenn du den vorherigen Absatz nicht komplett verstehst, bleib einfach bei malloc/free .

    EDIT: s#(beschriebe)#$1ne#s


Anmelden zum Antworten