2009-06-28 7 views
6

Ich denke, meine Frage ist, ob das folgende gilt CVariable Sized Arrays in C

int main(void) { 
    int r = 3; 
    int k[r]; 
    return 0; 
} 

Wenn ja, würde jemand darauf zu erklären, warum es nicht in Microsoft C-Compiler nicht funktioniert, aber in GCC, und wenn es dem C-Standard hinzugefügt wurde.

Vielen Dank

Antwort

3

Es ist eine GCC-Erweiterung, die der aktuelle MSVC nicht unterstützt. Sie können es in MSVC ersetzen ziemlich leicht mit einem _alloca (einem Stapel Zuteilung, die auf dem Teil der Programmierer keine manuelle Freigabe erforderlich):

#include <malloc.h> 

... 

int *k = (int *)_alloca(sizeof(*k)*r); 
+4

Es ist eine GCC-Erweiterung war, wurden aber kodifiziert in C99. MSVC unterstützt dies tatsächlich noch nicht. Beachten Sie auch, dass es auf Linux, ist es alloca(), nicht _alloca, und ist in bdonlan

+2

Es ist seit 10 Jahren standardisiert ... –

+0

Ich habe immer dieses verwendet, aber nicht den Fehler, bis ich Windows dies löschte meine Verwirrung – adk

13

Es ist in C99. MSVC unterstützt nur C89.

9

Die C99 standard hinzugefügt Arrays variabler Länge, aber andere Anbieter wie GCC hinzugefügt sie viel früher.

4

Es tut mir leid dies ist keine Antwort, aber ich möchte um auf ein mögliches Problem bei der Verwendung von Arrays mit variabler Länge hinzuweisen. Der Großteil des Codes, auf den ich gestoßen bin, sieht so aus.

void foo(int n) 
{ 
    int bar[n]; 
    . 
    . 
} 

Es gibt keine explizite Fehlerprüfung hier. Ein großer n kann leicht zu Problemen führen.

0

Es ist eine GCC-Erweiterung, die der aktuelle MSVC nicht unterstützt. Sie können es in MSVC zu ersetzen ziemlich leicht mit einem _alloca (eine Stapelzuweisung, die auf dem Teil der Programmierer keine manuelle Freigabe erforderlich)

ja, aber es ist begrenzt auf 1MB