Première erreur: size_t
est pas nécessairement unsigned int
, donc sa valeur maximale peut être différent de celui des unsigned int
(UINT_MAX
); de plus, en C++ pour obtenir des informations sur les limites d'un type, vous devez utiliser std::numeric_limits
.
#include <limits>
size_t s=std::numeric_limits<size_t>::max();
Deuxième erreur: vous n'obtiendrez jamais un tableau si gros; puisque size_t
est nécessaire pour pouvoir exprimer la plus grande taille de n'importe quel objet, il devrait probablement être assez grand pour exprimer un objet grand comme l'espace d'adressage disponible à l'application, mais essayer d'allouer un tel objet nécessiterait espace d'adressage à lui, qui est infaisable; en outre, vous demandez un tableau de int
s gros, ce qui signifie que ce sera UINT_MAX*sizeof(int)
octets grand, ce qui sera probablement environ 4 fois l'espace d'adressage entier - clairement absurde - et d'ailleurs sizeof(arr)
ne serait pas en mesure de exprimer la taille d'un tel objet, et en général les pointeurs ne pourraient même pas atteindre le sommet de ce tableau. Le compilateur détecte ces fautes et vous empêche de le faire. De plus, je déduis que vous essayez d'allouer cette chose sur la pile, qui est généralement beaucoup plus petite que toute la mémoire que l'application peut utiliser, et en général ce n'est pas une bonne idée d'y allouer de gros tableaux (vous devriez utiliser le tas pour cela). Troisième erreur: allouer toute cette mémoire n'a pas de sens.
Si vous avez besoin de beaucoup de mémoire, vous devez allouer des choses sur le tas, pas sur la pile, et allouer juste la mémoire dont vous avez besoin pour bien jouer avec le système d'exploitation et les autres applications (cette dernière considération ne s'applique pas si vous travaillez sur les systèmes embarqués où vous êtes la seule application en cours d'exécution).
Le deuxième extrait de C++ ne devrait même pas fonctionner, puisque, si cette chose est allouée sur la pile, vous allez non standard, puisqu'il s'agirait d'un VLA (disponible en C99 mais fortement rejeté du courant et du prochain standard C++). Cependant, dans ce cas, le code pour allouer ce tableau est utilisé au moment de l'exécution (les VLA en général ne sont pas fixés en dimensions), donc la vérification du compilateur n'est pas évidente à faire (bien que je suppose que optimiseur, qui, si la sémantique VLA n'est pas différente des tableaux réguliers, pourrait optimiser le VLA et essayer de faire un tableau régulier => qui échouerait pour les mêmes raisons que j'ai indiquées). Longue histoire courte: cela n'a aucun sens d'allouer toute cette mémoire (que vous ne pouviez même pas adresser), surtout sur la pile. Utilisez le tas et allouez juste ce dont vous avez besoin. Si vous avez des besoins particuliers, vous devez étudier les fonctions de mémoire virtuelle spéciales fournies par votre système d'exploitation.
Quel compilateur est-ce? FYI avec 'const' sur' size_t', les deux échouent dans Visual C++ v10 avec "la taille totale du tableau ne doit pas dépasser 0x7fffffff bytes" –
"J'ai trouvé que la taille maximale d'un tableau est size_t" - c'est incorrect, 'size_t 'n'est pas une constante, c'est un type (un' typedef' pour un type de données non signé). Le type de données sous-jacent réel dépend de la plateforme. Vous pouvez utiliser 'std :: numeric_limits :: max()' pour obtenir la valeur maximale pouvant être conservée dans une variable de type 'size_t'. –
Praetorian
Et vos deux extraits de code produisent cette erreur sur Visual Studio 2005: «erreur C2148: la taille totale du tableau ne doit pas dépasser 0x7fffffff octets» – Praetorian