Array, das einen Fehler verursacht, deklariert

8

Ich kann den folgenden Code in Codeblock-ID nicht ausführen , aber wenn ich das Array global deklariere, kann ich es ausführen . Was sind die Grenzen für Array? Größe, wenn global deklariert und lokal deklariert? Wie lautet die Daumenregel für die Erklärung der Array-Größe bei konkurrierenden Programmierwettbewerben wie spoj, codechef usw.?
Auch wenn der Fehler auf Codeblock-ID zurückzuführen ist. Wie kann ich es dann korrigieren?

%Vor%     
user1543957 21.11.2012, 13:21
quelle

3 Antworten

7

Der Grund, warum dies nicht erlaubt ist, ist, dass es insgesamt 999999 * sizeof (int) Bytes (7,6MiB in einer typischen 64-Bit-Umgebung) zum Stack-Rahmen von main () hinzufügen würde, was eine sehr große Menge ist Speicher für einen einzelnen Stapelrahmen.

Die maximale Größe eines Stapelrahmens hängt von Ihren Implementierungs- und Umgebungseinstellungen ab.

Wenn Sie diesen Speicher benötigen, sollten Sie ihn entweder statisch (mit einer statischen Variablen) oder dynamisch suchen, je nachdem, ob Sie mehrere Aufrufe von main () innerhalb Ihres Programms benötigen. Wenn Sie sich für dynamischen Speicher entscheiden, sollten Sie stattdessen einen Vektor verwenden und std::vector<int> arr(999999); verwenden, um einen Vektor mit der Anfangsgröße 999999 zu deklarieren.

    
Agentlien 21.11.2012 13:25
quelle
5

Ohne den genauen Fehler (können Sie das angeben?) ist es schwer zu sagen, was genau passiert ist, aber wahrscheinlich bekommen Sie einen Stack-Überlauf. Die spezifische Größe des Stapels ist definiert, die Plattform bietet einen Mittelwert der Vergrößerung.

Die einfachste und korrekteste Lösung für dieses Problem ist die Verwendung eines verwalteten Standardcontainers, um das Array wie ein std::vector zu halten. Dies wird dem FreeStore zugeordnet und verwaltet den Speicher für Sie sowie eine konsistente Schnittstelle / p> %Vor%

Als eine allgemeine Regel, bevorzugen Sie Container zu rohen Arrays gibt es sehr wenig, wenn Overhead.

Referenz

Ссылка

    
111111 21.11.2012 13:26
quelle
4

Im Allgemeinen werden Variablen, die im globalen Gültigkeitsbereich deklariert sind, im Abschnitt .data oder .bss einer ausführbaren ELF-Datei "zugewiesen". Variablen, einschließlich Vektoren, die innerhalb einer Methode / Funktion deklariert sind, werden dynamisch vom Stapel zugewiesen, wenn die Methode / Funktion ausgeführt wird. Die Größe des Stapels hängt vom Betriebssystem ab.

Zusammenfassend ist dieser Fehler höchstwahrscheinlich auf den Stack-Überlauf = D

zurückzuführen

In einem Programmierwettbewerb (spoj, topcoder, iccp, codejam usw.) ist es eine gute Idee, den Vektor dynamisch zu deklarieren. Sei es Vektor, Malloc oder neu. Dies garantiert, dass Sie nur die benötigte Speichermenge verwenden.

    
JohnTortugo 21.11.2012 13:29
quelle

Tags und Links