strdup et tableau a double dimension
Bonjour.
Je dois coder une fonction qui renvoie un tableau de caractères a double dimensions contenant:
-pour les premières cases des pointeur sur des chaînes de caractères copiées grâce à la fonction strdup
-pour la dernière case la valeur NULL
Je bute sur deux problèmes:
-mon l' initialisation de mon tableau de chaîne de caractères semble marcher mais au bout d un moment la chaine stockée dans la première case change
-comment libérer mon tableau crée
La macro SRV_N_UTIL_PTR(srv) me retourne le nombre nécessaire de case du tableau
La macro SRV_UTIL_NAME(srv,compteur) me retourne une chaîne de caractère
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
char **get_liste_utilisateurs(void)
{
char** stockage;
int compteur;
int nombreCaseTableau=*SRV_N_UTIL_PTR(srv);
// SRV_N_UTIL_PTR(srv) = Une macro qui me retourne le nombre nécessaire de case du tableau +1
stockage=malloc(nombreCaseTableau*sizeof(char));
//creation d un tableau de la taille du nombre d enregistre
if(stockage==NULL)
{
perror("\n impossible d allouer la RAM necessaire a la list d users \n");
exit(EXIT_FAILURE);
}
printf("\n nbre de case du tableau de stockage %i \n",nombreCaseTableau);
compteur=0;
while(compteur<=nombreCaseTableau-1)
{
// recuperation des données : utiliser strdup()
stockage[compteur]=strdup(SRV_UTIL_NAME(srv,compteur));
printf("\ntableau de stockage: %i %s \n",compteur,stockage[compteur]);
compteur++;
printf("\n str %s \n", stockage[0]);
}
// Marquer la fin du tableau
stockage[nombreCaseTableau]=NULL;
printf("\ntableau de stockage: %i %s \n",compteur,stockage[nombreCaseTableau]);
return stockage;
}
int main(int argc, char **argv)
{
char** listeUsers;
listeUsers=get_liste_utilisateurs();
int cpt=0;
printf("\n liste des users un test: %s \n", listeUsers[0]);
while(listeUsers[cpt]!=NULL)
{
printf("\n liste des users: %i %s \n", cpt, listeUsers[cpt]);*
//free(listeUsers[cpt]);
cpt++;
}
//free(listeUsers);
return 0;
} |
Voila le code qui s affiche dans la console avec les appelles à la fonction free commentés.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| ===============retourne liste user===============
nbre de case du tableau de stockage 5
tableau de stockage: 0 aaaaaaaa
str aaaaaaaa
tableau de stockage: 1 bbbbbb
str aaaaaaaa
tableau de stockage: 2 cccccc
str aaaaaaaa
tableau de stockage: 3 dddddddddddd
str aaaaaaaa
tableau de stockage: 4 eeeee
str `�aaaa
tableau de stockage: 5 (null)
liste des users un test: `�
liste des users: 0 `�
liste des users: 1 bbbbbb
liste des users: 2 cccccc
liste des users: 3 dddddddddddd
liste des users: 4 eeeee |
Comme vous pouvez le voir lors de ma quatrième initialisation la chaine pointée dans la première case du tableau se trouve corrompue.
Et je n'ai aucune idée du pourquoi???
Si j'utilise free pour
libérer toute les chaînes contenues dans mon tableau
libérer mon tableau lui même j ai le droit à un core dumped
Merci d'avance de votre aide :D