2009-06-16 4 views
3

J'ai besoin de définir un tableau de manière statique (dans un fichier * .h) de taille 12884901888 comme.Définition d'un grand tableau de taille supérieure à une limite int non signée

unsigned char sram[12884901888]; //All of my code is C. 

La déclaration ci-dessus donne une erreur et ne fonctionne pas. Parce que les constantes utilisées dans les déclarations de tableau sont des entiers int. Mais la constante que j'ai besoin d'utiliser (12884901888) est plus grande que la limite int non signée.

Comment puis-je définir le tableau comme ci-dessus, de taille 12884901888?

Merci.

-AD

post-scriptum Je sais que beaucoup diront, optimisez sur cette taille de tableau gigantesque, mais je dois utiliser même pour une raison spécifique à mon cas.

+0

Vous pouvez envisager d'utiliser un tableau à deux dimensions. J'oublie ce que la norme dit dans ce cas, mais je suis assez certain que (au moins dans C90) un tableau bidimensionnel de taille fixe est garanti d'utiliser une disposition de pointeur de ligne. Si tel est le cas, alors le tableau à deux dimensions peut être traité comme un tableau à une dimension (en utilisant la "formule" de mise en page de pointeur de ligne, bien sûr). –

Répondre

2

Rend la longueur du tableau un long non signé.

unsigned char sram[12884901888ULL]; 
+0

Dépend du compilateur. Si elle convertit la longueur à size_t en premier, cela ne fonctionnera pas. – finnw

2

Est-ce pour un microcontrôleur intégré? Vous pouvez souvent sortir avec quelque chose comme:

#define sram (*((unsigned char (*)[1]) 0)) 

À moins que votre compilateur implémente des bornes de contrôle, la taille du tableau n'a pas d'importance. Dans tous les cas, vous ne voulez pas que le compilateur tente de réserver 12884901888 octets car la liaison échouera.

+0

@finnw: Pouvez-vous expliquer ce qu'est la macro sram, que vous avez mentionné? Un pointeur vers un tableau, ...? – goldenmean

+0

C'est un tableau (pas un pointeur vers un.) – finnw

0

Conversion 12884901888 en hexadécimal donne: 0x3-0000-0000 (I séparé de chaque groupe de 16 bits)

En d'autres termes, ce tableau d'octets non signés a besoin de 3 fois 4 Gig Le compilateur est censé générer Pointeur d'adresse 34 bits pour que cela fonctionne

Je suis d'accord avec finnw, vous n'avez pas besoin de dire au compilateur la taille du tableau. Si vous spécifiez la taille, vous obtiendrez un gros fichier OBJ pour le module et ELF/EXE de même taille pour l'exécutable final.

Questions connexes