C ++ dynamische Größe statischer Array Puzzler

7

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!

    
Neil Steiner 08.06.2011, 19:57
quelle

5 Antworten

10

Variable-length-Arrays (VLAs) sind Teil von C99 und wurden lange von gcc unterstützt:

Ссылка

Beachten Sie, dass die Verwendung von VLAs in C90- und C ++ - Code nicht standardmäßig ist, aber von gcc als Erweiterung unterstützt wird.

    
NPE 08.06.2011, 19:58
quelle
6

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:

%Vor%     
Peter Alexander 08.06.2011 20:03
quelle
3

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.

    
Blagovest Buyukliev 08.06.2011 19:59
quelle
2

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.

    
Puppy 08.06.2011 19:59
quelle
2

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.

    
Neil Butterworth 08.06.2011 20:01
quelle

Tags und Links