Tableau de chaine de caractere

Bonjour,

J’ai quelque soucis avec un tableau de char*.

voici un bout du code

.....
//variable globale

char* tableauString[40];        // j'ai mis une taille de 40 mais je pourrait la réduire car je dois utiliser 8 case pour le moment

fonctionX (....)
{
   .......                                                                                                                   
   tableauString[indiceTableau] = (char*)malloc(strlen( (key) + 1 );          // les chaines de caractere du tableau peuvent etre de taille variable
   strcpy(tableauString[indiceTableau] ,key);
   .......
}

fonctionY( )
{
.......
 // je voudrais faire un free de mon tableau
.......
}


Pour faire le free, j’ai essayer plusieur methodes dont celle ci qui me parait la plus correcte :


for (i=0;i<8; i++ )
{
free(tableauString[i]);
}

Mais bon rien y fait, quand j’execute, le programme se plante…
Je ne vois pas comment faire pour arranger ca. Si quelqu’un peut m’aider.

Je vous remercie d’avance,

Virginie
Edité le 02/12/2009 à 15:52

il y a un manque d’information dans ton post :
1-Tu ne précise pas ton langage, mais ce doit être du C++ (char* qui précise un langage comme C ou C++, et free() qui est une méthode C++)
2-Tu développes et compiles avec quoi ? Visual C++, Borland, GNU(compilateur de linux)

le meilleur système pour débugger en C++ (technique mise au point avec GNU) des cout partout pour indiquer à quelle ligne tu plante précisément. ensuite ben tu débugges grâce à la doc.

Non c’est du C. En C++ on utilise new, new[], delete et delete[].

Pour le reste, c’est à chaque fois pareil : tu as un superbe outil qui s’appelle gdb ou le débuggage. Cela te permettra de voir où ça plante, sinon tu colles des printfs… mais c’est moins marrant, c’est sur.

Désolé pour les info manquante, je code en C sous labWindows.

J’avais déjà utiliser le debugger, c’est bien pour ca que je savais que c’etait la fonction free qui me faisait planter.
Au début je codais sous visual C++ 2003.
Mais en passant par Labwindows j’ai compris mon erreur, enfin compris j’ai vu pourquoi ca marchait pas : erreur de type : “memoire non allouée donc peut pas etre supprimé”.

Au final : certaines case de mon tableau n’était pas allouée de la même manière que les autres.
Pour certaines je les remplissait avec avec un : tableau[i]=variable
Pour les autres : strcpy(tableau[i],variable)

Le programme plantait sur le premier type de cellule. J’ai tout mis en strcpy et j’ai enfin réussit à faire des free.

Par contre je ne comprend pas pourquoi c’est comme ca, si quelqu’un à une idée.

Effectivement… si tu fais tout pointer au même endroit,le premier free va libérer l’adresse unique.

Si planté parce que le C est un langage restrictif.
l’assignation strcpy(tableau[i],variable) copié le contenue de ta variable dans la zone mémoire alloué à tableau[i] alors que
tableau[i]=variable fais pointer tableau[i] sur la zone mémoire de ta variable et non sur la zone mémoire alloué.
la zone mémoire de ta variable était surement dans la zone réservé à l’application (celle créer au moment sur lancement de l’application) aussi tu ne pouvais pas la libérer avec free car elle ne pouvait être libérée qu’au moment de l’arrêt du processus

Ok!

Je te remercie pour ton explication Akai! :slight_smile: