Dynamische array-Zuweisung auf stack in C
Ich habe gerade ein experiment gestern, und finde etwas verwirrend:
#include <stdio.h>
int main()
{
int j;
scanf("%d",&j);
const int i = j;
int arr[i];
return 0;
}
Die Anzahl j
ist zu Lesen von der Tastatur und es verwendet, um die Zuweisung der array - arr
auf den stack.
Nicht der compiler auch wissen, die Größe des Arrays zur compile-Zeit (j initialisiert auf 0?), aber es gibt keine Kompilierungsfehler. Wie ist es möglich?
In der Tat, sollten Sie klären, warum Sie denken, sollte der compiler einen Fehler liefern,
Suche
ich glaube, Sie haben studiert c89 all dieser Zeit..
wie nebenbei, indem Sie durch die zusätzliche variable
wie C11-tag Hinzugefügt wurde, beachten Sie, dass C11 eingeführt VLAs-Unterstützung optional.
Suche
[c] VLA
auf dieser Website.ich glaube, Sie haben studiert c89 all dieser Zeit..
wie nebenbei, indem Sie durch die zusätzliche variable
i
nutzlos ist und der code wäre auch gut ohne.wie C11-tag Hinzugefügt wurde, beachten Sie, dass C11 eingeführt VLAs-Unterstützung optional.
__STDC_NO_VLA__
Objekt-wie makro zu 1
wenn die konkrete Umsetzung nicht mit Ihnen umgehen.
InformationsquelleAutor user3769509 | 2014-10-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Variabler Länge arrays wurden Hinzugefügt C99. Es ist beschrieben in der C99-Begründung:
6.7.5.2 Array declarators
Gibt es keine "dynamische array Allokation auf dem stack". Die array-Größe angegeben werden muss bei der Deklaration.
Einige Compiler, wie GCC es Ihnen ermöglichen, als eine Erweiterung in C90 (GCC, dies entspricht ansi-und C89) Modus und C++. In diesen Fällen erhalten Sie eine Warnung (
-Wpedantic
) oder ein Fehler (-Werror
oder-pedantic-errors
). Konsultieren Sie die Dokumentation zu Ihrem compiler.Pro @Deduplicator Kommentar, Sie scheinen zu haben eine falsche Vorstellung. Variable length arrays, die nicht deklariert werden, statische.
§ 6.7.6.2
Dies bedeutet, dass
static
Lagerung undautomatic
Lagerung schließen sich gegenseitig aus.InformationsquelleAutor
Für einige eintauchen in die Funktionsweise der Zuweisung eine variable Menge an Speicher auf dem stack arbeiten kann, dies sehen wir, wie Sie ein compiler umsetzen können (nicht-standardisiert)
alloca()
Funktion:Alloca Umsetzung
Den C99-standard bietet Array mit variabler Länge ("VLA") mit im wesentlichen die gleiche Funktionalität; obwohl der Speicher zurückgefordert wird, auf einer pro-Rahmen-basis statt einer pro-Funktion basis:
Was ist der Unterschied zwischen alloca(n) und char x[n]?
Gibt es einige Gründe zu zögern, um entweder zu aggressiv mit unendlicher Größe. Es gibt keine Möglichkeit zu überprüfen, ob stack-Speicher ist verfügbar, wie Sie prüfen können, ob der heap-Speicher ist über. NULL von
malloc()
. Wenn die variable-Länge-array ist zu groß, wird es zu einem stack-überlauf und Undefiniertes Verhalten; gilt für beide Methoden von stack-Allokation:Warum ist der Einsatz von alloca() nicht als gute Praxis zu empfehlen?
InformationsquelleAutor HostileFork
C hat diese Funktion als array mit Variabler Länge. Arrays mit automatischer Speicherung-Dauer kann festgelegt werden, in die Flucht.
InformationsquelleAutor Vlad from Moscow