Arrays: Dynamisch <-> Statisch
-
Heute in der Systemprogrammierung-Vorlesung ist irgendwie eine kleine Welt für mich zusammengebrochen
In reinem Ansi-C kann man meines Wissens, Arrays variabler Größe doch nur dynamisch anlegen, also nicht statisch auf dem Stack. Einer meiner Mitkomilitonen meinte aber, dass das auch ohne malloc und Konsorten geht, was der Prof ihm aber auch nicht glauben wollte, also haben wir kurz folgenden Test-Programm geschrieben und kompiliert. Und tatsächlich folgender Code konnte mit dem GCC kompiliert werden:
int f(int n) { int array[n]; } int main() { f(5); return 0; }
Versuche ich denselben Code, aber mit dem VC++ 6 zu kompilieren bekomme ich die erwarteten Fehlermeldungen.
Jetzt meine Frage: Habe ich irgendwas verpasst und gibt es eine Änderung am C Standard, wonach man Arrays variabler Größe auch so anlegen kann wie oben beschrieben (und der VC++ 6 Kompiler ist einfach zu alt dazu) oder liegt das irgendwie am POSIX Standard ?
-
Schau mal da:
> g++ -pedantic ttt.cpp ttt.cpp: In function `int f(int)': ttt.cpp:3: error: ISO C++ forbids variable-size array `array'
Ist offensichtlich eine gcc-Erweiterung, die man mit -pedantic ausschalten kann.
Ich hoffe, ich habe Deine Welt wieder gerettet
-
Sowas nennt man einen VLA (Variable Lenght Array). Und wird soweit ich weis nur vom gcc unterstüzt. Gehört glaub ich auch nicht zum Standard.
Ob man sowas gut findet oder nicht ist Geschmacksache, Und ganz ehrlich ist für mich auch eine kleine Welt zusammengebrochen als ich das rausgefunden hab.
-
@Storm.Xapek.de: VLAs sind im C99 Standard enthalten. [1]
@tntnet: Mit C++ geht das auch nicht.
-
Wow, dann gehört das ja tatsächlich zum C Standard...
Wieder was gelernt...Schade, dass man sowas in so gut wie keinem Buch findet
-
Naja...
a) steht es im C99 Standard (welchen es auch auf Papier gibt
)
b) wird es sicher auch in Lehrbüchern vorkommen, sobald die verbreitetsten Compiler das unterstützenMan muss bedenken dass die Compilerhersteller sich an den Standard anpassen müssen, dass die Neuerung danach bekannt werden muss, und dass die Bücher auch dementsprechend überholt werden müssen. Da gehen dann schonmal so 10 Jahre ins Land bis so ein Feature Verbreitung findet.
-
Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Linux/Unix in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
int f(int n) { int array[n]; } int main() { f(5); return 0; }
Ich meine, was der Funktion int f(int n) als Argument übergeben wird, der Wert von n, muss zur
Compilierzeit bekannt sein.
Und wenn man das obige Beispiel ansieht, ist der Wert, der der Funktion f(5); in main() über-
geben wird, durchaus zur Compilierzeit bekannt.VC 8.0 Compiler
1>c:\inc\vla\vla\vla.cpp(8) : error C2057: Konstanter Ausdruck erwartet
1>c:\inc\vla\vla\vla.cpp(8) : error C2466: Zuordnung eines Arrays der konstanten Größe 0 nicht möglich.
1>c:\inc\vla\vla\vla.cpp(8) : error C2133: 'array': Unbekannte GrößeIn C++ schreib ich mir ne Template-Funktion die genau das leistet. Alle Werte müssen aber zur
Compilierzeit bekannt sein.VLA in C ist das mehr als eine Template-Funktion in C++ leisten kann?
mfg
-
In C++ gibt es ja auch noch std::vector.
-
Helmut S. schrieb:
VLA in C ist das mehr als eine Template-Funktion in C++ leisten kann?
kann schon sein. vla's sind ja nix anderes als versteckte 'alloca()' aufrufe. aber bei templates bekommste ja die errors beim compilieren um die ohren geschmissen. was ist nun, wenn man f() mit 0xfffffff aufruft? da würde ich doch lieber malloc() nehmen...
-
Helmut S. schrieb:
Ich meine, was der Funktion int f(int n) als Argument übergeben wird, der Wert von n, muss zur
Compilierzeit bekannt sein.
Und wenn man das obige Beispiel ansieht, ist der Wert, der der Funktion f(5); in main() über-
geben wird, durchaus zur Compilierzeit bekannt.VC 8.0 Compiler
1>c:\inc\vla\vla\vla.cpp(8) : error C2057: Konstanter Ausdruck erwartet
1>c:\inc\vla\vla\vla.cpp(8) : error C2466: Zuordnung eines Arrays der konstanten Größe 0 nicht möglich.
1>c:\inc\vla\vla\vla.cpp(8) : error C2133: 'array': Unbekannte GrößeIn C++ schreib ich mir ne Template-Funktion die genau das leistet. Alle Werte müssen aber zur
Compilierzeit bekannt sein.VLA in C ist das mehr als eine Template-Funktion in C++ leisten kann?
mfg
Daran liegt das aber nicht. Hab das auch so getestet, dass man eine einfache Integer-Variable per scanf einliest und dann einen Array mit dieser Größe anlegt. Auch das funzt einwandfrei.
Wie schon gesagt, der C Standard (nicht der C++ Standard) sagt, dass das geht. Aber implementiert hat das anscheinend nur der GCC-Compiler.
-
Die Größe von n muss nicht zur Compilezeit bekannt sein,
sondern beim Aufruf der Funktion, so dass der Stackzeiger entsprechend verringert (der Stack wächst doch von oben nach unten, verflixt, schon wieder so lang her...) werden kann.
-