Bonjour,
J'aime pas ça mais je vais demander de l'aide
J'ai fait une fonction qui prend deux paramètres :
- nom d'un repertoire (type char*)
- "tableaux" pour lister le contenu (type char***)
La fonction lit le contenu du dossier spécifié dans le paramètre 1. Si c'est un fichier régulier ou un dossier (autre que . et ..), elle inscrit son nom dans le "tableau" pointé par le 2e paramètre.
En début de fonction, je fais donc un malloc sur le contenu du 2e argument et si besoin je fais un réalloc dessus (s'il y a "beaucoup" de fichiers). Il s'avère que ce procédé de réallocation me renvoie l'erreur indiqué dans le titre : realloc(): invalid next size. Cette erreur ne survient pas à la première réallocation. Selon la taille du malloc initial, ca peut planter à la 2e ou la 4e... Google ne m'a pas permis de trouver de réponse helpfull.
Voici le code la fonction :
Merci du coup de main !
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
57
58
59
60
61 int repLister(const char *nomRepertoire, char ***listeFichiers) { DIR *repertoire = NULL; struct dirent *entite = NULL; int indice=0; // ne s'incremente que pour les fichiers affiches int taille=3; // Ouverture du dossier if(NULL== (repertoire=opendir(nomRepertoire)) ) { perror("Impossible d'ouvrir le dossier"); return -1; } // Allocation dynamique de la liste ; elle sera agrandie si besoin if(NULL == (*listeFichiers=malloc(taille*sizeof(char*)))) { perror("Impossible d'allouer la memoire pour la liste"); return -2; } // Lister les elements + affichage while( (entite=readdir(repertoire)) ) { if( ((entite->d_type==DT_REG) || (entite->d_type==DT_DIR)) && strcmp(entite->d_name, ".")!=0 && strcmp(entite->d_name, "..")!=0 ) { if(NULL == (*((*listeFichiers)+indice) = malloc(strlen(entite->d_name)) ) ) { perror("Impossible d'allouer la memoire un element de liste"); return -2; } strcpy( *((*listeFichiers)+indice), entite->d_name); printf("%d : %s%s\n", indice, (entite->d_type==DT_DIR) ? "(dir) " : "", entite->d_name); indice=indice+1; } else { // Ne rien faire pour les fichiers speciaux // ainsi que pour les dossiers . et .. } // Liste pleine ? if(indice==taille) { taille=taille*2; printf("\tReallocation dans repLister avec taille = %d\n",taille); if(NULL == realloc(*listeFichiers, taille*sizeof(char*))) { perror("Impossible de reallouer la memoire pour la liste"); return -2; } } } return indice; }
Partager