Warum ist die Array-Größe begrenzt, wenn sie zur Kompilierzeit deklariert wird?

8

zum Beispiel kann ich

tun %Vor%

aber ich kann das nicht ohne Absturz des Programms tun:

%Vor%

warum ist das so?

    
ladookie 29.06.2011, 03:03
quelle

3 Antworten

11

Nehmen wir an, dass arr eine lokale Variable ist, deklariert es als ein Array Speicher aus dem (relativ begrenzten) Stapel, während malloc() Speicher aus dem (vergleichsweise unbegrenzten) Heap verwendet.

    
Adam Liss 29.06.2011, 03:05
quelle
2

Wenn Sie diese als lokale Variablen in Funktionen zuweisen (was die einzige Stelle ist, an der direkt auf die Zeigerdeklaration ein malloc -Aufruf folgt), besteht der Unterschied darin, dass malloc einen Teil des Speichers reserviert aus dem Heap und geben Sie ihre Adresse, während direkt int arr[1048575]; wird versuchen, den Speicher auf dem Stapel zuzuordnen. Der Stapel hat viel weniger Platz zur Verfügung.

Der Stack ist aus zwei Gründen, die mir bekannt sind, in der Größe begrenzt:

  1. Herkömmliche imperative Programmierung nutzt sehr wenig Rekursion, so dass tiefe Rekursion (und starkes Stack-Wachstum) "wahrscheinlich" ein Zeichen von unendlicher Rekursion ist, und daher ein Bug, der den Prozess umbringt. Es ist daher am besten, wenn es abgefangen wird bevor der Prozess den Gigabytes an virtuellem Speicher verbraucht (bei einer 32-Bit-Architektur), der dazu führt, dass der Prozess seinen Adressraum erschöpft (an diesem Punkt benutzt die Maschine wahrscheinlich weit) mehr virtuellen Speicher als tatsächlich RAM hat und daher extrem langsam arbeitet).
  2. Multithread-Programme benötigen mehrere Stacks. Daher muss das Laufzeitsystem wissen, dass der Stack niemals über eine bestimmte Grenze hinaus wachsen wird. Daher kann ein weiterer Stack nach dieser Grenze platziert werden, wenn ein neuer Thread erstellt wird.
Ben 29.06.2011 03:08
quelle
1

Wenn Sie ein Array deklarieren, platzieren Sie es auf dem Stapel.

Wenn Sie malloc () aufrufen, wird der Speicher aus dem Heap übernommen.

Der Stapel ist normalerweise begrenzter als der Heap und ist normalerweise vorübergehend (aber er hängt davon ab, wie oft Sie die Funktion eingeben und verlassen, in der dieses Array deklariert ist.)

Für solch einen großen (vielleicht nicht nach heutigen Standards?) Speicher ist es eine gute Praxis, ihn zu malloc zu machen, vorausgesetzt, Sie möchten, dass das Array für ein bisschen durchhält.

    
tchen 29.06.2011 03:10
quelle