Core sur un free

AA -  
 AA -
Bonjour,

je suis entrain de revoir un code qui core. Je ne comprends pas pourquoi est-ce qu'il core sur un free.
On a un tableau de chaine de caracteres (char**). On verifie síl est nul et si chaque element est nul puis on libere la memoire:

if (tokenpp != NULL) {
for(i=0;i < nb_token; i++) {
if (tokenpp[i] != NULL) {
free(tokenpp[i]);
tokenpp[i] = NULL;
}
}
free(tokenpp);
tokenpp = NULL;
}

Le programme core sur free(tokenpp[i]);
Est-ce que quelqu un aurait une idee svp?

Merci.
A voir également:

2 réponses

ekra Messages postés 1873 Statut Membre 342
 
Merci de préciser le langage... Ca peut paraitre évident mais bon...
 if (tokenpp != NULL) { 
     free(tokenpp);
     tokenpp=NULL
}


Inutile de faire une boucle. Enfin ca depend aussi de ton code précédent...
0
AA
 
Salut,
le langage est le C. Je fais une boucle parce que j'alloue de la memoire pour les elements du tableau.
Si je fais ce que tu dis je perdrai de la memoire.

Merci.
0
ekra Messages postés 1873 Statut Membre 342
 
En fait il aurait été bien de voir la déclaration de ton tokenpp ainsi que son allocation.

si c'est un :
int *tokenpp;

Alors si tu fait ce que je te dis, tu ne perdras pas la mémoire. La taille de ton taleau a été transmis de malloc() a free().
Si en revanche tu as fait une allocation et une boucle d'allocation (Tableaux 2D) tu dois en effet faire des free() en boucle.
0
AA
 
Salut,

char **tokenspp = NULL;
tokenspp = (char **)malloc(sizeof(char *) * nb_token);

tokenspp[i] = (char *)calloc(y, sizeof(char));

strncpy(tokenspp[i], datap, x);

if (tokenpp != NULL) {
for(i=0;i < nb_token; i++) {
if (tokenpp[i] != NULL) {
free(tokenpp[i]);
tokenpp[i] = NULL;
}
}
free(tokenpp);
tokenpp = NULL;
}

C'est bien une boucle dont j'ai besoin. Je ne comprends pas pourquoi avec la boucle que je fais j'ai un core sur le free(tokenpp[i]);

Je dois surement louper qqc mais je n arrive pas a voir quoi.

Merci pour ton aide.
0
ekra Messages postés 1873 Statut Membre 342
 
if (tokenpp[i] != NULL)

As-tu mis a NULL tous les tokenpp[i] avant ? :)
0
AA > ekra Messages postés 1873 Statut Membre
 
Jái 4 lignes dans le tableau. Quand je fais des printf je remarque que le deuxieme est NULL et les autres remplis:

tokenpp[0] : xTOTO0x
tokenpp[1] : xx
tokenpp[2] : xTOTO2x
tokenpp[3] : xTOTO3x
0
ekra Messages postés 1873 Statut Membre 342 > AA
 
Le code que tu as fourni ne peux pas m'aider sur cette erreur. As-tu mis à NULL tous les pointeur tokenpp[i] avant ?
for (i=0;i<nbToken;i++) {
      tokenpp[i]=NULL;
}

Si tu n'as pas ça, c'est normal que ça rate.
0
AA > ekra Messages postés 1873 Statut Membre
 
Desole, le code existant est constitue de la sorte:

une fonction get_tokens a ete creee:
char ** get_tokens(
char *datap,
char sep,
int *nb_tokenp,
int flag)

Dans laquelle on fait la partie:

char **tokenspp = NULL;
tokenspp = (char **)malloc(sizeof(char *) * nb_token);

tokenspp[i] = (char *)calloc(y, sizeof(char));

strncpy(tokenspp[i], datap, x);


Puis dans une autre fonction on fait appel a celle ci:

char **tokenspp = NULL;
tokenpp = get_tokens(addressp, '\n', &nb_token, BOOLEAN_FALSE);

on recupere les donnees dans tokenpp et enfin on fait la boucle que je t'ai mis en haut avec le free.
A aucun moment je fais :
tokenpp[i]=NULL;
sauf apres les free. Je considere quún malloc et un calloc mettent automatiquement a null les poiteurs.

Merci
0
ekra Messages postés 1873 Statut Membre 342 > AA
 
Un malloc ne met pas l'espace alloué à NULL contrairement au calloc !
0