comment bien gratuit un char **tableau en C
J'ai besoin de vos conseils sur ce morceau de code:
les champs de la table options[0], les options[1] etc... ne semble pas être libéré correctement.
Merci pour vos réponses
int main()
{
....
char **options;
options = generate_fields(user_input);
for(i = 0; i < sizeof(options) / sizeof(options[0]); i++) {
free(options[i]);
options[i] = NULL;
}
free(options);
}
char ** generate_fields(char *)
{
char ** options = malloc(256*sizeof(char *));
...
return options;
}
Vous devez vous connecter pour publier un commentaire.
Le problème est: est-ce
options
est un type de pointeur, pas de type tableau, doncsizeof(options)
sera toujours le même (en général 4 octets sur une machine 32 bits ou 8 octets sur une machine 64 bits), doncsizeof(options)/sizeof(options[0])
sera presque toujours 1.La clé est de toujours
free
mémoire de la même manière que vousmalloc
'ed elle. Donc, si vousmalloc
un tableau en 2 dimensions, puismalloc
une série de 1-dimensions des tableaux, vous devez faire l'inverse lors de la libération de ça:Noter que si la taille (256 dans ce cas) n'est pas une constante, vous avez besoin de garder une trace de vous-même, car sinon vous n'avez aucun moyen de savoir combien de fois en boucle lors de la libération.
Vous devriez avoir le même nombre de
free
s que vous avezmalloc
s.Dans votre code que vous allouer le tableau de pointeurs, mais vous n'avez pas à allouer de la mémoire pour les différents éléments de la matrice de point de. Mais libérer le code est écrit comme si vous ne.
Je vais ajouter à Adam de réponse ici, car c'est probablement ce qui ne rentre pas dans un commentaire. Adam est complètement à droite. Je soupçonne votre generate_fields fonction, cependant, peut-être effectivement l'entrée de l'utilisateur, je ne suis pas sûr. En tout cas, il y a deux façons de procéder:
et libre de la fonction, que je vais laisser de côté pour des raisons de concision. Vous pouvez voir ce qui se passe: nous sommes de passage dans le nombre de champs et la taille du champ. Modifier la présente autour de que vous avez besoin. L'autre option consiste à générer des champs de passer de nouveau à la routine, il est appelé à partir de la taille de la matrice. J'aimerais faire quelque chose comme ceci:
Et vous appelez à partir d'principal comme ceci:
Ou si vous n'aimez pas que la notation, vous pouvez toujours vous en tenir à ce que vous avez eu:
Comme le prototype de fonction (options de retour de ce temps et de ne
size=
quelque part dans le code et d'appel de la principale comme ceci:Espère que vous donne encore plus d'idées, Adam, n'hésitez pas à modifier tout ou partie de cette dans votre réponse appropriée, il s'agit de votre réponse de toute façon.