2017-09-01 2 views
-2

j'avais du mal à comprendre pourquoitaille du tableau initialisé dynamiquement exemple

int n; 

cin>>n; 
int arr[n]; 

œuvres. On m'a dit que ce code ne devrait pas s'exécuter car la valeur de 'n' ne pouvait être déclarée que pendant l'exécution et ne devrait donc pas être compilée. On m'a également dit que ma variable 'n' devrait être constante. Comment le rendre constant quand il y a un «cin» (j'ai du mal à comprendre comment intégrer une constante). Je sais que le code est plutôt simple, mais je suis en conflit à cause de ce qu'on m'a dit.

+8

Les VLA ne sont pas conformes aux normes C++! Ce dont vous avez réellement besoin est 'std :: vector arr (n);'. – user0042

Répondre

0

Selon la norme C++ ([dcl.array])

Dans une déclaration TD où D est de la forme

D1 [-expression constante opt] attribut-spécificateur -seq opt

la taille d'un ar rayon doit être constant (ou non spécifié avec un initialiseur approprié). Cependant, certains développeurs de compilateurs ont choisi d'autoriser les tableaux à longueur variable (VLA) pour la commodité du programmeur, pour maintenir la capacité de compiler du code C en C++ (C a permis VLA depuis le standard C99), ou un but infâme nous pouvons seulement apprendre après avoir conquis le monde.

La meilleure solution conforme à la norme est use a std::vector lorsque la taille de l'allocation ne peut pas être connue au moment de la compilation.

int n; 

if (cin>>n) // don't allocate unless n is valid 
{ 
    vector<int> arr(n); 
    // use arr 
} 

Même si VLA est disponible, le vector est encore une solution plus sûre. vector est allouée à partir du stockage dynamique, souvent un magasin de données beaucoup plus important que le stockage automatique, et si l'allocation échoue, une exception est levée. Le comportement d'un tableau de longueur variable trop grand pour le stockage est souvent indéfini et déborde probablement la pile (une forme courante de stockage automatique), ce qui entraîne la multiplication des bogues mystérieux.

L'allocation de mémoire brute avec new devrait être évitée car elle prend en charge la gestion supplémentaire (elle doit être supprimée manuellement à un moment donné avec delete[]) et la comptabilité (la taille de l'allocation est inconnue au pointeur) responsabilités. Le programmeur peut aussi avoir maintenant besoin d'adresser The Rules of Three and Five.

0

Les gens n'utilisent plus de tableaux, utilisent un vecteur ou une liste, vous n'avez pas à vous soucier de les dimensionner et il y a beaucoup de fonctions utiles disponibles pour traiter les données dans leur.