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
Voila le code qui s affiche dans la console avec les appelles à la fonction free commentés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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
Partager