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 : 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;
}
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
===============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