Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

7 réponses
Avatar
programmation
Dans mon programme C, j'ai allou=E9 de la m=E9moire dynamiquement.

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


Mais, son ex=E9cution ne se passe pas bien. Le d=E9bogage indique que
l'erreur est au niveau de lib=E9ration de la m=E9moire.
De plus, lorsque j'ai enlev=E9 le code suivant qui pr=E9sente la
lib=E9ration de l'espace de la m=E9moire utilis=E9:
if(t)
{
for (i =3D 0; i < N; i++)

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


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

free(rets);
}


Que proposez vous ?

Merci.

7 réponses

Avatar
Bertrand Lenoir-Welter
> 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é ?
Avatar
marc
On 5 nov, 00:39, programmation wrote:
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.
Avatar
Vincent Burel
"programmation" wrote in message
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
Avatar
programmation
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.
Avatar
Thierry
"programmation" wrote in message
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.
Avatar
programmation
> 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.
Avatar
Thierry
"programmation" wrote in message
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.