2014-04-08 17 views
9

Programm mit großer globaler Array:Warum stürzt ein großes lokales Array mein Programm ab?

int ar[2000000]; 

int main() 
{ 
} 

Programm mit großem lokalem Array:

int main() 
{ 
    int ar[2000000]; 
} 

Wenn ich ein Array mit großer Größe in der Hauptfunktion deklarieren, das Programm abstürzt, aber wenn ich es erklären als global funktioniert alles gut. Warum das?

Antwort

14

Wenn das Array global deklariert wird, fügt der Compiler den Platz für das Array in den Datenabschnitt der kompilierten Binärdatei ein. In diesem Fall haben Sie die Binärgröße um 8 MB (2000000 * 4 Bytes pro Int) erhöht. Dies bedeutet jedoch, dass der Speicher jederzeit verfügbar ist und nicht auf dem Stack oder Heap zugewiesen werden muss.

EDIT: @Blue Mond Recht ausführt, dass ein nicht initialisierter Array wird höchstwahrscheinlich in der bss Datensegment zugeordnet werden und kann in der Tat keine zusätzlichen Speicherplatz einnehmen. Ein initialisiertes Array wird statisch zugewiesen.

Wenn Sie ein Array so groß in Ihrem Programm deklarieren, haben Sie wahrscheinlich die Stack-Größe des Programms überschritten (und ironischerweise verursacht stack overflow).

Eine bessere Möglichkeit, ein großes Array dynamisch zuzuweisen ist, um einen Zeiger zu verwenden, und den Speicher auf der Halde wie diese zuzuteilen:

using namespace std; 
int main() { 
    int *ar; 
    ar = malloc(2000000 * sizeof(int)); 

    if (ar != null) { 
    // Do something 
    free(ar); 
    } 

    return 0; 
} 

Ein gutes Tutorial auf den Memory Layout of C Programs can be found here.

+0

Vergessen Sie auch nicht zu überprüfen, dass malloc erfolgreich war – dkrikun

+1

In Visual Studio könnten Sie wahrscheinlich verwenden, um die maximale Stackgröße zu erhöhen: http://msdn.microsoft.com/en-us/library/tdkhxaks.aspx – dkrikun

+0

Während das Ganze - wo geht was - über Globals und Objekte mit expliziter statischer Dauer ein Implementierungsdetail ist, gehen typischerweise nicht initialisierte Variablen in den .bss-Bereich und blasen keine Binärgröße auf. Und [mit Namespace std; ist in C++ verpönt] (http://stackoverflow.com/questions/1452721/why-isusing-namespace-std-considered-bad-practice). –

Verwandte Themen