[c] allocation dynamique de tableau
Résolu
factor
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous,
je vous présente mon problème, je souhaite faire l'allocation dynamique de tableaux dans une structure.
j'écris donc :
en faisant de cette manière, je souhaite allouer de la mémoire à un de mes tableaux dans la structure.
Pourtant rien ne s'affiche à mon printf, j'ai l'impression qu'il y a un problème dans l'allocation dynamique.
Je vous remercie d'avance pour vos réponses.
je vous présente mon problème, je souhaite faire l'allocation dynamique de tableaux dans une structure.
j'écris donc :
#include <stdio.h> #include <stdlib.h> typedef struct { int *tab; int tab2[20]; }file; int main() { int size; scanf("/d",&size); file fichier; fichier.tab=(int*) malloc((size+1)*sizeof(int)); for(int i=0; i<size; i++) { fichier.tab[i]=i; printf("/d", fichier.tab[i]); } system("PAUSE"); return 0; }
en faisant de cette manière, je souhaite allouer de la mémoire à un de mes tableaux dans la structure.
Pourtant rien ne s'affiche à mon printf, j'ai l'impression qu'il y a un problème dans l'allocation dynamique.
Je vous remercie d'avance pour vos réponses.
A voir également:
- [c] allocation dynamique de tableau
- Tableau croisé dynamique - Guide
- Tableau word - Guide
- Exemple tableau croisé dynamique télécharger - Télécharger - Tableur
- Tableau ascii - Guide
- Trier un tableau excel - Guide
2 réponses
Bonjour,
Dans les printf/scanf, ce n'est pas "/d" qu'il faut mettre mais "%d".
Sinon quelques remarques :
Pourquoi mettre size+1 et non size ? Il n'y a pas besoin de (int *) devant.
Il vaut mieux déclarer (int i) en dehors. Même si c'est accepté avec la norme ISO C99, ce n'est pas trop dans l'esprit du C. De plus tous les compilateurs ne sont pas conformes entièrement au ISO C99 et tu perdrais donc de la portabilité.
Et enfin, tu as oublié free(fichier.tab); à la fin du main (juste avant le system("pause");).
Dans les printf/scanf, ce n'est pas "/d" qu'il faut mettre mais "%d".
Sinon quelques remarques :
fichier.tab=(int*) malloc((size+1)*sizeof(int));
Pourquoi mettre size+1 et non size ? Il n'y a pas besoin de (int *) devant.
for(int i=0; i<size; i++)
Il vaut mieux déclarer (int i) en dehors. Même si c'est accepté avec la norme ISO C99, ce n'est pas trop dans l'esprit du C. De plus tous les compilateurs ne sont pas conformes entièrement au ISO C99 et tu perdrais donc de la portabilité.
Et enfin, tu as oublié free(fichier.tab); à la fin du main (juste avant le system("pause");).
Bonsoir,
merci tout fonctionne, l'erreur était tellement bête ^^
sinon je met le (int *), car sinon le compilateur ne fonctionne pas : error C2440: '=' : impossible de convertir de 'void *' en 'int *'
La conversion de 'void*' en pointeur vers non 'void' nécessite un cast explicite.
C'est mon prof de C qui m'a fait mettre celà.
encore merci bonne soirée
merci tout fonctionne, l'erreur était tellement bête ^^
sinon je met le (int *), car sinon le compilateur ne fonctionne pas : error C2440: '=' : impossible de convertir de 'void *' en 'int *'
La conversion de 'void*' en pointeur vers non 'void' nécessite un cast explicite.
C'est mon prof de C qui m'a fait mettre celà.
encore merci bonne soirée
oO. C'est quoi comme compilateur ???
A mon avis, ce n'est pas un compilateur C mais C++ que tu utilises. Car en C, le cast void * en int * c'est implicite. Et donc il n'y en a pas besoin.du cast.
Les profs de C ont la facheuse tendance de dire qu'il faut caster car avant (version K&R) c'était obligatoire (le void * n'existait pas). Mais depuis la version ANSI, le cast est superflu. Il est même conseillé de ne pas le mettre (à moins de vouloir assurer une rétrocompatibilité).
Mais le principal est que ça marche.
Cdlt,
A mon avis, ce n'est pas un compilateur C mais C++ que tu utilises. Car en C, le cast void * en int * c'est implicite. Et donc il n'y en a pas besoin.du cast.
Les profs de C ont la facheuse tendance de dire qu'il faut caster car avant (version K&R) c'était obligatoire (le void * n'existait pas). Mais depuis la version ANSI, le cast est superflu. Il est même conseillé de ne pas le mettre (à moins de vouloir assurer une rétrocompatibilité).
Mais le principal est que ça marche.
Cdlt,