I thought array is *al*located memory during load time but seems like the above example works during run-time.
Ja, normale Arrays wie <datatype> <Array_Name> [<size>]
erhalten während der Ladezeit Speicher, der in C89 vorhanden ist und auch in C99 existiert.
Aber im Code-Ausschnitt int a[n];
ist ein Variable Length Array oder kurz VLA. VLAs in C99 sind genau wie jedes andere Array definiert, außer dass die Länge keine Kompilierzeitkonstante sein muss.
Ein anständiger Artikel über die Notwendigkeit von VLAs finden Sie hier: Ссылка :)
Ich bin kein Experte in C, aber dies könnte ein Array variabler Länge sein, das von C99 und unterstützt von GCC , zum Beispiel. GCC reserviert den Speicher für ein solches Array im Stack, so dass es automatisch freigegeben wird, wenn Sie von der Funktion zurückkehren.
Arrays variabler Länge wurden in C89 nicht gefunden, sind aber ein neues Feature in C99.
>Wenn Sie angeben, wie Ihr Code geschrieben ist (insbesondere, dass Sie eine Anweisung haben), muss dies Code innerhalb einer Funktion sein.
Obwohl ich nicht sicher bin, ob dies in der Spezifikation genau erforderlich ist, werden innerhalb einer Funktion alle automatischen Arrays (d. h. Funktionsebene, nicht statisch) auf den Stapel gelegt. Unabhängig davon, ob Sie ein reguläres oder ein VL-Array haben, wird der Speicher zur Laufzeit zugewiesen.
Der Speicher für nicht automatische Arrays wird zur Laufzeit nicht behandelt, daher wird VLA nicht unterstützt. Wenn Sie versuchen, den folgenden Code zu kompilieren:
%Vor%Auf dem Compiler habe ich das getestet (gcc 4.2.1), ich habe folgende Fehler:
%Vor%