2010-05-10 25 views
6

Ich bin neu in C-Programmierung. Ich versuche, die Größe des Arrays mithilfe einer Variablen festzulegen, aber ich erhalte einen Fehler: Speichergröße von 'Array' ist nicht konstant !!c Arrays: Größe dynamisch einstellen?

01 int bound = bound*4; 

02 static GLubyte vertsArray[bound]; 

Ich habe bemerkt, dass, wenn ich Grenzen (in der Klammer auf der Leitung 02) mit der Nummer sagen, ‚20‘ ersetzt wird, würde das Programm ohne Probleme läuft. Aber ich versuche, die Größe des Arrays dynamisch zu setzen ...

Irgendwelche Ideen, warum ich diesen Fehler bekomme? dank viel,

Antwort

5

Um ein Array von einer nicht konstanten Größe erstellen (dh zum Zeitpunkt der Kompilierung bekannt ist), müssen Sie dynamisch Speicherplatz zuweisen für sie malloc() mit (und es entsprechend free() Verwendung freigeben, wenn es nicht mehr benötigt wird) .

Wie andere bemerkt haben, ist die Fähigkeit, dynamische Arrays zu deklarieren, in C99-kompatiblen Compilern verfügbar.

11

Sie erhalten diesen Fehler, weil, wie der Compiler Ihnen gesagt hat, Ihre Array-Größe nicht konstant ist. In der C89/90-Version von C muss die Spracharraygröße eine Konstante sein. Sie können die Größe des Arrays nicht dynamisch festlegen. Wenn Sie ein laufzeitgroßes Array benötigen, müssen Sie es entweder manuell mit malloc zuweisen oder einen nicht standardmäßigen Compiler-spezifischen Ansatz verwenden (wie alloca Funktion).

In C99 Version der C-Sprache wurde die Unterstützung für sogenannte Variable-Length-Arrays (VLA) hinzugefügt. Ein C99-Compiler würde eine runtime-dimensionierte Array-Deklaration für ein automatisches-Array akzeptieren. Aber selbst in C99 können Sie kein statisches Array der Laufzeitgröße deklarieren, wie Sie es versuchen.

3

Was Sie wollen, ist in C99 möglich; Mit früheren Versionen von C stecken Sie jedoch fest, Funktionen aufzurufen, Speicher dynamisch zuzuweisen, z. alloca(3) oder malloc(3).

-3

Verwendung entweder dieser

GLubyte* vertsArray = (GLubyte*) malloc(sizeof(GLubyte) * bound); 

GLubyte* vertsArray = new GLubyte[bound]; 

erinnere mich an den Speicher freizugeben, wenn das Objekt nicht mehr benötigen

delete [] vertsArray; 

free((void*)vertsArray; 

Trotz allem, was sie in den Kommentaren, sage ich immer noch sagen, dass Sie es vorziehen sollten neu anstelle von malloc wenn Sie nicht 100% gezwungen sind, C zu verwenden. Siehe hierzu link for more information

+2

Falsche Sprache - das ist eine C-Frage. :) – Arafangion

+0

Ich dachte, dass die Malloc und kostenlose Ansatz für C waren, und aus diesem Grund sagte ich lieber die Verwendung von new/löschen nur wenn unterstützt ... –

+6

Wenn Ihr Compiler 'new' /' delete' unterstützt, ist es ein C++ Compiler, kein C-Compiler. Und Sie sollten wirklich keinen C++ - Compiler verwenden, um C-Code aus verschiedenen Gründen zu kompilieren. Sie sollten niemanden ermutigen, der C verwendet, um C++ zu verwenden, "wenn ihr Compiler dies unterstützt". –