[c] allocation dynamique de tableau

Résolu
factor -  
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 :
#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:

2 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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
factor
 
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   Statut Contributeur Dernière intervention   1 846
 
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
factor
 
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   Statut Contributeur Dernière intervention   1 846
 
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