Taille d'un tableau en C

Résolu/Fermé
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 - 27 oct. 2013 à 01:50
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 27 oct. 2013 à 17:36
Bonjour,

Je voudrais savoir s'il était possible de créer un tableau (d'entiers par ex.) d'une taille définie par l'utilisateur, du genre :
int n;
scanf("%d",n);
int * tableau[n];
J'ai lu que c'était "possible en C99 mais pas pour les raisons auxquelles on pense" sur Internet, mais mes profs m'ont dit que ce n'était pas possible.
Des personnes pour clarifier la situation ?

Merci, bonne soirée !

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
27 oct. 2013 à 10:37
Bonjour,

Oui c'est possible. La façon classique de faire est l'allocation dynamique avec malloc/calloc.
Exemple :

int n;
int ret;
ret=scanf("%d", &n);
if (ret==1 && n>0) {
char *tableau;
tableau = malloc(n * sizeof(*tableau));
...
free(tableau), tableau=NULL;
}
Explication :
On crée un pointeur (char *tableau), on alloue une zone dans la mémoire Heap de n entiers (malloc(n*sizeof(*tableau));) et on fait pointer tableau sur cette zone fraichement créée (tableau=malloc...).

Jusqu'au C99, il n'y avait que cette façon de faire. int tableau[n]; était une erreur puisque n devait être un nombre;
Le C99 fait apparaître, entre autres, le Variable Length Array qui permet d'écrire le code que tu as écrit. Mais quand on débute, c'est mieux de commencer avec le malloc/calloc qui est un mécanisme important. D'autant que tous les compilateurs ne sont pas conformes C99.
Pour ton prof qui dit que ce n'est pas possible, c'est tout simplement qu'il n'est pas à jour.

Cdlt,
1
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 1 121
27 oct. 2013 à 11:47
Tu as répondu à ma question, merci !

En fait mon problème serait plutôt de créer une matrice, mais ça ne doit pas changer grand chose ;)

Bref, résolu et encore merci !
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 27/10/2013 à 17:36
Effectivement, ça ne change pas grand chose pour une matrice.
Exemple rapide d'une matrice X lignes, Y colonnes (sans contrôle des valeurs de retour) :

int i;
char **tab=malloc(X * sizeof(*tab));
for (i=0; i<X; i++) {
tab[i]=malloc(Y * sizeof(**tab));
}
/*Pour les free() c'est la même logique*/
0