2009-05-26 4 views
1

Ich habe ein Problem während der Arbeit an einem C-Code mit Microsoft Visual Studio-2005-Compiler konfrontiert.Kompilierungsfehler: kann kein Array mit konstanter Größe 0 zuweisen. Warum bekomme ich das?

Ich habe versucht, einen großen Puffer statisch als zu erklären:

int gbl_data[4096*4096*256]; 

EDIT: Diese Deklaration eine globale Variable in einer Header-Datei war.

Es gab eine Kompilierung Fehler sagen - "kann kein Array der konstanten Größe 0 zuweisen".

Bedeutet irgendwie die Größe von 4096X4096X256 wurde zu groß als die MAX_INT_LIMIT Größe (2^31) und kann sich um und wird -ve oder so. Aber dann hätte es einen Fehler als "negativer Index" geben sollen.

Ich habe versucht, die Konstanten als 4096UL x 4096UL x 256UL, immer noch gleichen Kompilierungsfehler.

Was ist die Ursache für diesen Fehler?

Liegt es daran, dass die physische Speichergröße nicht ausreicht, um diesen großen Puffer zuzuordnen oder was?

Was ist die Lösung dafür?

Vielen Dank.

-GM.

+0

Wie groß ist eine Instanz von gbl_data? – sharptooth

+0

ist es eine Reihe von Ints. gbl_data ist nur der Array-Name :) – jalf

+2

"Ich habe versucht, einen großen Puffer zu deklarieren" ist eine Untertreibung :) –

Antwort

9

Die Array-Größe ist kein int, es ist ein unsigned int. Ein unsigned int hat einen Maximalwert von 4294967295 Sie bekam man mehr, und es wickelt so um auf 0

die Konstanten als longs Casting etwas nicht ändert, weil longs sind auch 32-Bit-Integer am meisten Plattformen.

Sie könnten stattdessen mit langen Longs versuchen, aber jetzt stoßen wir auf ein weiteres kleines Problem.

Sie versuchen, 4 Milliarden Ganzzahlen zuzuordnen. eine 32-Bit-CPU hat einen Speicherplatz von 4 Milliarden Bytes. Sie versuchen, das 4-fache der theoretisch maximal verfügbaren Speichermenge zuzuweisen. (16GB)

Also zurück zum Zeichenbrett. Finde heraus, warum du das versucht hast und was du stattdessen tun kannst.

+0

Zuweisung von mehr als 4 GB ist kein Problem auf einer 32-Bit-CPU. Verfügbare Erinnerung != Verfügbarer Adressraum. Zum Beispiel siehe http://blogs.msdn.com/oldnewthing/archive/2004/08/10/211890.aspx oder http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of -memory-does-not-refer-auf-physical-memory.aspx – Joe

+1

Sie haben eine seltsame Definition von "ist kein Problem". Ich denke nicht, dass "kein Problem ist" ist ziemlich das gleiche wie "kann getan werden, mit ausreichenden Mengen durch Hoops springen. Nicht sicher, was Ihr Punkt ist. Sind Sie ernsthaft vorschlug, dass die OP sollte dies verwenden, anstatt nur repariere sein Programm? – jalf

+0

Wenn das OP 16GB zuweisen muss, was schlägst du als eine Reparatur vor? Wenn das ist, was er braucht, ist es definitiv möglich. Ich bestreite gerade die falsche Aussage "Sie versuchen, 4mal zuzuteilen maximale theoretische Menge an Speicher, die existieren kann. " – Joe

0

Sie versuchen, ein Array von 2^32 (oder das 4-fache des Adressraums auf einem 32-Bit-System) statisch zuzuordnen. Der Compiler scheint 4096 * 4096 * 256 (Was ist, von der Spitze meines Kopfes, 0x10000) zu einem 32-Bit-Wert abgeschnitten.

Je nach Ihrer Plattform kann ein unsigned long auch 32bit sein und ebenfalls abgeschnitten.

Ich würde vorschlagen, stellen Sie sicher, dass Sie für eine 64-Bit-Plattform kompilieren (wenn das ist, was Sie beabsichtigen), oder ändern Sie den Algorithmus entweder Speicher dynamisch zuweisen (natürlich nicht mehr als den Adressraum), oder Wok mit Dateien auf der Festplatte.