problème en libération de la mèmoire

Le
programmation
Dans mon programme C, j'ai alloué de la mémoire dynamiquement.

char ***rets = NULL, **interret = NULL, **t = NULL;
.
t = (char **) malloc(N * sizeof(*t));
.
rets = malloc (nbre * sizeof(char**));
..
interret = *rets;
..
interret = xrealloc(interret, (++interret_size) * sizeof(char*));


Mais, son exécution ne se passe pas bien. Le débogage indique que
l'erreur est au niveau de libération de la mémoire.
De plus, lorsque j'ai enlevé le code suivant qui présente la
libération de l'espace de la mémoire utilisé:
if(t)
{
for (i = 0; i < N; i++)

free(t[i]);
free(t);
}


for (i = 0; i < nbre; i++)
{
while (rets && rets[i])
free(rets[i]);

free(rets);
}


Que proposez vous ?

Merci.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Bertrand Lenoir-Welter
Le #20491541
> char ***rets = NULL, **interret = NULL, **t = NULL;



Wow ! Un pointeur sur un pointeur sur un pointeur ?

Il ne manquerait pas encore une étoile, histoire d'avoir un pointeur sur
tout ça ? Ou bien c'est le délai de répétition de votre clavier qui est
mal réglé ?
marc
Le #20491611
On 5 nov, 00:39, programmation
Dans mon programme C, j'ai alloué de la mémoire dynamiquement.

char ***rets = NULL, **interret = NULL, **t = NULL;

Que proposez vous ?



De lire le K&R, comme on t'a je crois déjà recommandé, car tu ne
sembles pas savoir ce qu'est un pointeur et son utilité.
Ce qui est légèrement bloquant en C.
Vincent Burel
Le #20498011
"programmation" news:

Dans mon programme C, j'ai alloué de la mémoire dynamiquement.
char ***rets = NULL, **interret = NULL, **t = NULL;



huh ! ?

interret = xrealloc(interret, (++interret_size) * sizeof(char*));



évitez des évaluations qui modifier un argument genre (++interret_size) dans
un appel de fonction.

for (i = 0; i < N; i++)

free(t[i]);
free(t);
}



Vous libérez des pointeurs qui sont dans un tableau , mais vous libérez
aussi le tableau en question à chaque tour.
La logique voudrais qu'on ait plutot :

for (i = 0; i < N; i++)
{
free(t[i]);
}
free(t);


Que proposez vous ?



Ben , de faire du code plus explicite déjà !

VB
programmation
Le #20498051
Bonjour,
Je voulais allouer un tableau t des chaines de caractères de taille N.
J'ai fait:
[code]
char **t = NULL;
t = (char **) malloc(N * sizeof(*t));[/code]

Puis, je passe ce tableau comme paramètre à une fonction 'comb_att()'
pour le remplir comme le suivant:
[code]
comb_att(t,N); [/code]

Ensuite, j'affiche ce tableau t comme suit:
[code]
for(v=0;v<N;v++)
printf(":::: %sn",t[v]);
[/code]
et pour la libération de tableau t, je fais comme suit:
[code]if(t)
{
for (i = 0; i < N; i++)
free(t[i]);
free(t);
}[/code]

et dans le code de la fonction 'comb_att()' voici comment j'ai déclaré
t:


Lorsque je lance l'exécution alors elle s'arrête juste après l'appel
de la fonction 'comb_att()' et donc je n'obtiens pas l'affichage de
tableau t.


voici la fonction 'comb_att()' :
[code]int comb_att(char **t,int N)
{
...........
.....................

//lire un fichier
//chaque ligne contient trois champs
//pour chaque ligne de fichier mettre le premier et le deuxième champ
dans une case de tableau t

fp=fopen("in.txt","r");
if (fp == NULL)
{
printf("impossible d'ouvrier le fichiern");
exit(0);
}

for(i=0; i < N;i++)
{
fgets(s, 100, fp);
sscanf(s,"%s%s%S",attribut1,attribut2,attribut3);

strcat(t[i],attribut1);
strcat(t[i]," ");
strcat(t[i]," attribut2")
}

fclose(fp);
return 0;

}

[/code]

- Est ce que on a besoin de mettre comme valeur de retour pour la
fonction 'comb_att' ?

- C'est juste la partie suivante ?
[code] strcat(t[i],attribut1);
strcat(t[i]," ");
strcat(t[i]," attribut2")
[/code]
Je voulais chaque case de tableau t contient le deux premiers champ de
fichier. ces deux champs sont séparés par un espace

- Quelle est la différence si on met t[i] ou *t[i] dans la fonction
'strcat()' ?

Merci.
Thierry
Le #20500931
"programmation" news:
Bonjour,
Je voulais allouer un tableau t des chaines de caractères de taille N.
J'ai fait:
[code]
char **t = NULL;
t = (char **) malloc(N * sizeof(*t));[/code]



Puis, je passe ce tableau comme paramètre à une fonction 'comb_att()'



Stop !
Tu alloues le tableau mais pas les elements de ce tableau.
for (int loop = 0; loop < N; loop++)
t[i] = (char *) malloc(taille_maxi_de_chaine);


Un conseil (de base): utilises des noms de variables plus explicites.
programmation
Le #20506601
> Tu alloues le tableau mais pas les elements de ce tableau.
for (int loop = 0; loop < N; loop++)
  t[i] = (char *) malloc(taille_maxi_de_chaine);

Un conseil (de base): utilises des noms de variables plus explicites.



Voici les allocations que j'ai fait:

Code :

int main()
{
char **tab=NULL;
int N,cp,i;
tab = (char **) malloc(N * sizeof(*tab));

for (cp = 0; cp < N; cp++)
tab[cp] = (char *) malloc( N*sizeof(tab));

comb_att(tab,N);

//affichage de résultat:
for(i=0;i<N;i++)
printf("%sn",tab[i];

return 0;
}



Je crois que ces allocations ne sont pas justes car je voulais créer
un tableau de taille M avec M est le nombre de combinaisons possible
formé par N mots.
par exemple Si on a 4 mots c'est à dire N=4
Donc, M 
car on a:
- 6 combinaisons possibles formé par 2 mots.
- 4 combinaisons possibles formé par 3 mots.
- 1 combinaison formée par 1 mot

Je ne précise pas dans l'allocation la taille maximale car je ne sais
pas en avance cette taille.
Est ce que c'est nécessaire de la fixer ?

Chaque case de tableau contient une combinaison possible donc on a M
cases et la taille de case est variante puisque elle dépend de nombre
de mots formant de chaque combinaison.

Que proposez vous ?

J'ai autre demande:
On a un fichier texte 'f.txt' qui contient dans chaque ligne une
chaine de caractère.
Je voulais charger ce fichier dans un tableau T.
Mais je ne sais pas combien la taille de tableau à allouer .
Si on fait comme çà:
T = (char **) malloc(n * sizeof(*T));

for (i = 0; i < n; i++)
T[i] = (char *) malloc(sizeof(T));

Avec n est la taille de tableau (nombre des cases).
C'est juste ? Combien est la taille maximale de chaine de caractères ?

Dans la deuxième allocation on ne précise pas la taille maximale de
chaine caractère (non connu) allouée par chaque case de tableau T ?


Merci.
Thierry
Le #20519261
"programmation" news:

int main()
{
char **tab=NULL;
int N,cp,i;
tab = (char **) malloc(N * sizeof(*tab));



N est non initialisé !

for (cp = 0; cp < N; cp++)
tab[cp] = (char *) malloc( N*sizeof(tab));



idem.

Je ne précise pas dans l'allocation la taille maximale car je ne sais
pas en avance cette taille.
Est ce que c'est nécessaire de la fixer ?



Oui !

Chaque case de tableau contient une combinaison possible donc on a M
cases et la taille de case est variante puisque elle dépend de nombre
de mots formant de chaque combinaison.

Je voulais charger ce fichier dans un tableau T.
Mais je ne sais pas combien la taille de tableau à allouer .
Si on fait comme çà:
T = (char **) malloc(n * sizeof(*T));




for (i = 0; i < n; i++)
T[i] = (char *) malloc(sizeof(T));



Taille pas bonne.

Serieusement, il faut lire le K&R.
Publicité
Poster une réponse
Anonyme