Bei dem Versuch, jemandem zu erklären, warum ein statisches C ++ - Array nicht dynamisch skaliert werden konnte, fand ich gcc mit mir nicht einverstanden. Wie wird der folgende Code überhaupt kompiliert, da die Dimension argc von Array zur Kompilierzeit nicht bekannt ist?
%Vor%Ich habe das mit gcc 4.2.1 getestet und -Wall angegeben, ohne vom Compiler so etwas wie ein dreckiges Aussehen zu bekommen. Wenn ich die letzte Schleife auskommentiere, erhalte ich einen segfault, wenn ich Array [53] zuweisen.
Ich hatte zuvor Schutzarrays vor und nach der Deklaration von array platziert und sie mit Nullen aufgefüllt. Sicher, dass das Programm einen Teil seines Stacks löschen muss, aber gcc hat die Variablen neu angeordnet stapeln, so dass ich keine Datenkorruption beobachten konnte.
Offensichtlich versuche ich nicht, diesen Code zu "funktionieren". Ich versuche nur zu verstehen, warum gcc sogar denkt, dass es den Code kompilieren kann. Alle Hinweise oder Erklärungen würden sehr geschätzt werden.
Update: Vielen Dank an alle für Ihre hilfreichen und lächerlich schnellen Antworten!
Das ist ein Array variabler Länge , das Teil des C99-Standards ist. Es ist jedoch nicht Teil von C ++.
Sie können auch die Funktion alloca
verwenden, die ebenfalls kein Standard-C ++ ist, aber weitgehend unterstützt wird:
Diese werden Arrays mit variabler Länge genannt (verfügbar seit C99) und können nur als automatische Variable deklariert werden - versuchen Sie, static
vorzusetzen und der Compiler wird sie ablehnen. Es wird nur der Stapelzeiger mit einer Variablen anstatt mit einem konstanten Offset erhöht, nicht mehr als das.
Vor der Einführung von Arrays variabler Länge wurde die Zuweisung von Objekten mit variabler Größe auf dem Stack mit der Funktion alloca
durchgeführt.
Stapelbasierte Arrays mit variabler Größe sind eine Erweiterung von G ++ und dort vollkommen legitim. Sie sind jedoch nicht Standard. Stack-basierte Arrays können zwar bei den meisten Implementierungen unterschiedlich groß sein, aber der Standard schreibt dies nicht vor.
Arrays in C ++ können nur mit einem konstanten Ausdruck skaliert werden. Arrays, die über eine nicht-konstante Größe verfügen, sind entweder Teil von C99 oder eine schreckliche Erweiterung, die uns von GCC aufgezwungen wurde. Sie können den Großteil des GCC-Mists loswerden, indem Sie beim Kompilieren von C ++ - Code das -pedantic
-Flag verwenden.