[c] allocation dynamique de tableau

Résolu/Fermé
factor - 21 juin 2011 à 16:48
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 22 juin 2011 à 08:35
Bonjour à tous,

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.


2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
21 juin 2011 à 19:31
Bonjour,

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");).
1
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
22 juin 2011 à 00:13
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,
0
C'est visual studio c++, j'utilise des fichiers sources en .cpp, ça doit être pour cela non ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
22 juin 2011 à 08:35
Oui .cpp c'est pour du C++, donc ton compilateur traitera le fichier comme un code C++.
D'où le message d'erreur. Avec un compilateur C (mettre le fichier .c suffit peut-être), tu n'auras pas message d'erreur (ni de warning) si tu ne castes pas.
0