Je m'enseignons moi-même programmation pendant quelques années et j'étais sûr que si vous avez besoin de la déclaration de tableau d'un numéro de variable, vous devez utiliser Aujourd'hui, j'ai constaté que cela compilait sous g ++ version 4.4.4, sans avertissements ni erreurs: p> aussi il compile complètement si vous utilisez GCC (après le changement de < code> COUT code> et sous Visual Studio Ce code ne parvient pas à compiler Étant donné que Quand cela a été changé? Ceci est une méthode sûre? P> P> MALLOC code> ou
neuf code>.
CIN code> avec
printf code> et
scanf code>) p>
taille_array code> n'est pas constant. p>
8 Réponses :
Non c'est non en sécurité du tout. Cela pourrait corrompre votre pile. P>
Cela pourrait - ce qui se passe s'il met dans -1 code>?
+1 Je viens de tester cela et a eu une corruption de mémoire une fois que j'ai commencé à allouer des nombres négatifs. Doit avoir une chèque pour> 0 avant d'initialiser.
Ceci est une fonction C99 - VLA - qui ne fait pas partie de la norme C ++ . Vous pouvez l'utiliser si votre compilateur prend en charge et vous n'avez pas besoin de portabilité. Si le compilateur le supporte, il est parfaitement sûr d'utiliser - mais c'est une mauvaise habitude en utilisant des fonctionnalités non standard. P>
Coffre-fort même si je mettais une taille_array ++ dans la boucle? sûrement pas?
@Tom: Oui, c'est. Vous ne changerez pas la taille de la matrice en faisant cela, cependant.
@Tom: Bien sûr. La pile pour la VLA est attribuée une fois et non modifiée, Tailleof fournira la taille réelle. Si vous modifiez la variable que vous utilisez pour indiquer la taille d'un tableau, cela n'a pas d'importance, que ce soit VLA ou non - c'est une erreur logique.
@Erik: avec C ++ 0X étant basé sur C99, savez-vous s'il intégré VLA dans C ++ 0x ou non? Une recherche rapide à travers la norme n'a rien donné d'utile.
@Matthieu M. Otoh, non, ils ne l'ont pas fait. Je semble me souvenir d'entendre une raison pour cela, mais je ne m'en souviens pas maintenant
@Matthiew m: VLAS ne faisant pas partie de C ++ 0x.
@Matthieu M. Je me souviens de l'argument maintenant ... il romprait la capacité de Titreof de toujours être utilisé dans des expressions constantes intégrées. Je doute que c'est la seule raison même si - VLAS est pur mal Imnsho :)
@Erik: Je dois admettre que je les aime bien, bien que la mise en œuvre devienne bientôt difficile, surtout lorsque vous souhaitez que VLA dans des objets: D Cela pourrait également avoir à voir avec vecteur code> faisant partie de la STL. peut ne pas avoir ressenti comme obligé comme dans C.
voir http://www.parashift.com /c++-faq-lite/freestore-mgmt.htm#faq-16.20 . P>
Mettez simplement, en C99, cela s'appelle VLA et fait partie de la norme (corrigez-moi si je me trompe) mais en C ++, cela ne fait pas partie de la norme. Si vous avez besoin de cette fonctionnalité, utilisez std: vecteur code> à la place. P>
Cela dépend si vous écrivez C ou C ++. Je suppose que c comme pour c ++, tu ferais mieux d'utiliser std :: vecteur plutôt qu'un tableau. P>
en C Cela dépend de quelle VersiUuon vous utilisez. Si et seulement si vous utilisez un compilateur standard de C99, le tableau peut prendre sa taille d'une variable au moment de l'exécution, comme vous le faites ici, sinon la taille doit être définie lors de la compilation. Visual Studio ne prend pas en charge le tableau dynamique - voir MSDN P>
C ++ utilise la norme C89 afin que la taille soit définie lors de la compilation. P>
Donc, dans votre cas, vous devez voir ce que vous avez passé avec le compilateur. P>
Comme indiqué par @eric, le code est C ++ pour que le compilateur de travail utilise une extention non standard, donc pour GNU, j'ajouterais drapeaux pour appliquer une norme, par exemple -ansi ou -std = c ++ 98 et -pedantic p>
Il y a une extension de GCC imitant des tableaux de longueur variable C99. Ce n'est pas standard C ++. P>
Cependant, même si vous avez ceci désactivé em>, le code posté peut compiler. La norme ne nécessite pas de diagnostic pour ce cas: son comportement non défini, pas une erreur. P>
Dans des cas vraiment évidents, un compilateur peut choisir de vous empêcher d'écrire cela, mais sinon il est libre de vous laisser tomber en paix. P>
Conclusion: Ne vous laissez pas berner par la compilation. C'est toujours mauvais et faux. P>
Vous pouvez obtenir cette fonctionnalité en C ou C ++ avec ALLOCA (_ALLOCA sous Windows). std :: vecteur n'est pas un substitut: il est alloué sur le tas, avec de nouveau, qui appelle malloc, potentiellement coûteux. P>
Il y a une bonne raison pour laquelle vous voudrez peut-être avoir un tableau dont la longueur est déterminée à l'exécution allouée sur la pile: c'est vraiment rapide. Supposons que vous ayez une boucle qui s'exécute fréquemment, mais dispose d'une matrice qui dépend de quelque chose à l'exécution (par exemple, la taille de votre widget Canvas). Vous ne pouvez pas simplement coder un numéro: votre programme s'écrasera lorsque nous obtenons tous 36 "300 DPI Retina-Afficher moniteurs et pixels [2400] n'est plus sûr. Mais vous ne voulez pas de nouveau, ou votre boucle frappe un malloc et obtient lentement. p>
Bien que, pour les grandes matrices, il peut être préférable d'avoir un STD :: Vecteur statique à la fonction A SEULEMENT est redimensionné (plus grand) lorsque votre pile a une taille limitée. P>
(voir http://msdn.microsoft.com /en-us/library/wb1s57t5(vs.71).aspx ) p>
Il est normal d'utiliser la fonctionnalité si vous utilisez C99. p>
Vous devez faire très attention à la valeur de la taille. Une valeur importante débordera de votre pile et votre processus peut devenir fou. P>
C balise supprimée, car ce code n'est même pas à distance C.
Peut-être dupliquer: Stackoverflow.com/questions/2427336/...
@Deadmg, Soltys note que la question s'applique toujours si vous utilisez PrintF et SCANF. L'exemple est C ++, la question est plus générale.