2009-05-26 9 views
1

J'ai rencontré un problème en travaillant sur un code C avec le compilateur Microsoft Visual Studio-2005.Erreur de compilation: impossible d'allouer un tableau de taille constante 0. Pourquoi l'obtenir?

J'ai essayé de déclarer un gros tampon statiquement comme:

int gbl_data[4096*4096*256]; 

EDIT: Cette déclaration est une variable globale dans un fichier d'en-tête.

Il était en train de donner une erreur de compilation en disant - "ne peut pas allouer un tableau de taille constante 0". Cela signifie en quelque sorte que la taille de 4096X4096X256 devenait trop grande par rapport à la taille de MAX_INT_LIMIT (2^31) et peut être enroulée et devenir -ve ou presque. Mais alors il aurait dû donner une erreur comme "indice négatif".

J'ai essayé de transformer les constantes en 4096UL x 4096UL x 256UL, toujours la même erreur de compilation.

Quelle est la cause de cette erreur? Est-ce parce que la taille de la mémoire physique est insuffisante pour allouer ce tampon de grande taille ou quoi?

Quelle est la solution pour cela?

Merci à vous.

-GM.

+0

Quelle est la taille d'une instance de gbl_data? – sharptooth

+0

c'est un tableau d'ints. gbl_data est juste le nom du tableau :) – jalf

+2

"J'ai essayé de déclarer un gros tampon" est un euphémisme :) –

Répondre

9

La taille du tableau n'est pas un entier, c'est un entier non signé. Un unsigned int a une valeur maximum de 4294967295. Vous avez un plus, et il enroule autour de 0.

casting les constantes que désire ardemment ne change rien, parce que désire ardemment sont aussi entiers de 32 bits sur la plupart plates-formes. À la place, vous pourriez essayer avec des longs longs, mais maintenant nous rencontrons un autre petit problème.

Vous essayez d'allouer 4 milliards d'entiers. un processeur 32 bits dispose d'un espace mémoire de 4 milliards octets. Vous essayez d'allouer 4 fois la quantité maximale de mémoire théorique qui peut exister. (16 Go)

Retour à la planche à dessin. Découvrez pourquoi vous essayez de le faire, et ce que vous pouvez faire à la place.

+0

Allouer plus de 4 Go n'est pas un problème sur un processeur 32 bits. Mémoire disponible != Espace d'adresse disponible. Par exemple, voir http://blogs.msdn.com/oldnewthing/archive/2004/08/10/211890.aspx ou http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of -memory-does-not-refer-to-physical-memory.aspx – Joe

+1

Vous avez une étrange définition de "n'est pas un problème". Je ne pense pas que "ce n'est pas un problème" est tout à fait la même chose que "peut être fait, avec des quantités suffisantes de sauter à travers les cerceaux." Vous n'êtes pas sûr de ce que vous voulez dire. réparer son programme? – jalf

+0

Si l'OP doit allouer 16 Go, que suggérez-vous comme une solution? Si c'est ce dont il a besoin, c'est certainement possible.Je conteste juste la déclaration incorrecte "Vous essayez d'allouer 4 fois la quantité théorique maximale de mémoire qui peut exister. " – Joe

0

Vous tentez d'allouer statiquement un tableau de 2^32 (ou 4 fois l'espace adresse, sur un système 32 bits). Le compilateur semble tronquer 4096 * 4096 * 256 (ce qui est, du haut de ma tête, 0x10000) à une valeur de 32 bits. En fonction de votre plate-forme, un fichier long non signé peut également contenir 32 bits, et également être tronqué. Je vous suggère de vous assurer que vous compilez pour une plate-forme 64 bits (si c'est ce que vous voulez), ou changez l'algorithme soit pour allouer dynamiquement de la mémoire (évidemment pas plus que l'espace d'adressage), ou wok avec des fichiers sur le disque.

Questions connexes