C: Comment rendre la taille d’un tableau dynamic?

Je lis dans le livre: «C Primer Plus» qui me dit en standard C99, il est correct d’utiliser une grammaire telle que:

int b=4; char a[b]; 

Mais lorsque je mets ce code dans vs2013, il me dit que “l’expression doit avoir une valeur constante”.

Le livre est faux? Ou il y a une nouvelle fonctionnalité sur vs2013 dont je n’étais pas au courant?

Cela s’appelle des tableaux de longueur variable , et je suppose que votre compilateur VS2013 ne les prend pas en charge.

Je vous conseillerais de passer à un autre compilateur. Les versions récentes de GCC ou de Clang / LLVM prennent en charge les VLA, ainsi que C99 et même la plupart des versions de C11 .

En fait, je vous suggérerais même de basculer vos efforts de développement et votre système vers Linux . Les outils de développement sont alors généralement des logiciels libres , comme l’ensemble du système.

Sinon, utilisez un pointeur, obtenu par exemple avec malloc (3) (ou calloc ); mais alors, vous devriez tester l’allocation contre l’échec et plus tard appeler free . Évitez les memory leaks (utilisez un outil tel que valgrind, s’il est disponible). Peut-être que votre compilateur supporte alloca (3), non standard mais largement disponible. Pensez peut-être aussi à utiliser un ramasse-miettes à l’échelle du programme comme le GC asservi de Boehm : vous utiliserez alors GC_malloc au lieu de malloc mais vous n’aurez pas besoin d’appeler GC_free !

VS2013 ne prend pas en charge la déclaration de longueur variable.

Vous ne pouvez pas entrer une valeur non constante entre les crochets lorsque vous déclarez votre tableau:

 char a[b]; 

Étant donné que l’utilisateur prend de la taille, le compilateur ne peut pas dire à l’avance combien de mémoire il a besoin pour char array a . La chose la plus facile à faire ici (en particulier pour un exercice) est simplement de choisir une valeur relativement grande et d’en faire une allocation constante, comme:

char a [1024];

Et ensuite, si vous voulez faire attention (et vous devriez), vous pouvez vérifier si (b> 1024) et imprimer une erreur si l’utilisateur veut un b qui dépasse les limites pré-allouées.

Si vous voulez avoir du chic, vous pouvez définir char a[] sans taille prédéfinie, comme char *a; et puis vous allouez plus tard avec malloc:

 a = (char *)malloc(sizeof(char) * b); 

Ensuite, vous devez également libérer char a[] plus tard, lorsque vous avez terminé:

 free(a); 

J’espère que ça aide!