implémentation de ls -R et allocation mémoire
Bonjour,
Je suis entrain d'implémenter la fonction ls -R
J'ai d'abord une fonction Liste qui (je crois) fonctionne bien...
Puis une fonction ListeRecursive qui appelle ma fonction Liste
j'ai plein d'erreur de ce type la quand je lance ma fonction ListeRecursive
Code:
1 2
| ls(5056) malloc: *** error for object 0x1002d0: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug |
Je sais que ma recursion fonctionne, car j'arrive bien a afficher la liste des sous répertoire, mais c'est quand j'appelle ma fonction Liste que je rencontre des problèmes.
Alors je ne sais pas... quelles structures je dois allouer? Pourquoi? est-ce que je dois les "free"? Pourquoi? pfffff
Please, reconciliez moi avec le C! D'avance merci
Gabriel
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| int Liste (char* dirname){
DIR* dir;
struct dirent* dirent;
if (!(dir = opendir (dirname))){
perror("opendir");
return 0;
}
while((dirent = readdir(dir))){
if (strcmp(".",dirent->d_name) && strcmp("..",dirent->d_name))
printf("%s\n",dirent->d_name);
}
if (closedir(dir) != 0){
perror("closedir");
return 0;
}
return 1;
} |
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
| void ListeRecursive (char* dirname){
DIR* dir;
struct dirent* dirent;
char* dirname_tmp;
struct stat st;
printf("%s:\n",dirname);
if (Liste(dirname) == 0)
exit(EXIT_FAILURE);
if (!(dir = opendir (dirname))){
perror("opendir");
exit(EXIT_FAILURE);
}
while((dirent = readdir(dir))){
if (strcmp(".",dirent->d_name) && strcmp("..",dirent->d_name)){
if ((dirname_tmp = malloc(strlen(dirname)+strlen(dirent->d_name)+1)) == NULL){
perror("malloc");
exit(EXIT_FAILURE);
}
strcpy(dirname_tmp,dirname);
dirname_tmp = strcat(dirname_tmp,"/");
dirname_tmp = strcat(dirname_tmp,dirent->d_name);
if (stat(dirname_tmp,&st) == -1){
perror("stat");
exit(EXIT_FAILURE);
}
if (S_ISDIR(st.st_mode))
ListeRecursive(dirname_tmp);
free(dirname_tmp);
}
}
closedir(dir); |