Variable Length Arrays waren Teil der C-Sprache seit C99. Sie wurden jedoch als ein Merkmal in C11 gemacht - was bedeutet, dass eine C11-konforme Implementierung es nicht bereitstellen muss (obwohl praktisch alle Implementierungen, die C99 unterstützen, sicherlich VLAs in C11 bereitstellen).
Sie können überprüfen, ob Ihre Implementierung keine VLAs mit dem Makro __STDC_NO_VLA__
bereitstellt (wenn es im Kompatibilitätsmodus C99 oder C11 definiert ist, unterstützt Ihre Implementierung keine VLAs).
So eine Array Größe zur Laufzeit möglich ist, in der modernen C (> = C99) und Code wie unten Entscheidung ist in Ordnung:
int s;
printf("Enter the array size: ");
scanf("%d", &s);
int a[s];
Ein offensichtlicher Nachteil VLAs ist, dass, wenn s
recht groß ist und die Zuweisung von a
coud fail. Schlimmer noch, es gibt keine Möglichkeit zu überprüfen, ob die Zuweisung fehlgeschlagen ist und Sie Laufzeitfehler (z. B. segfault) auftreten. Es ist im Wesentlichen undefined behaviour. So möchten Sie VLAs vermeiden, wenn die Array-Größe zu groß ist. Grundsätzlich, im Zweifel, gehen Sie für dynamische Speicherzuweisung (siehe unten).
Ein anderes Problem, viel weniger schwerwiegend im Vergleich zu anderen, mit VLAs ist, dass sie automatische Speicherdauer (aka "Stapel zugeordnet") haben. Also, wenn Sie etwas wollen, das für längere Dauer dauert, dann die Block Scope wo die VLA erklärt wird, dann sind VLAs keine Hilfe.
In C89 gibt es kein VLA. Daher ist die Verwendung der dynamischen Speicherzuweisung der einzige Weg. Obwohl es einige nicht-standardmäßige Erweiterungen gab, wie alloca()
, die VLA ähnlich ist und die gleichen Nachteile wie VLAs aufweist).
int s;
printf("enter the array size: ");
scanf("%d",&s);
int *a = malloc(s * sizeof *a);
...
free(a);
Oh ich sehe. Danke. also alle Elemente des Arrays immer noch auf dem Stack? – root
Ja, das sind sie. Wenn das schlecht ist, benutze malloc wie in anderen Antworten vorgeschlagen. –