2010-01-19 3 views
0

J'ai ci-dessous des lignes dans mon code écrit en C sur la plate-forme Unix. S'il vous plaît laissez-moi savoir pourquoi je reçois noyau jeté dans la fonction closedir(). Je pourrais ouvrir avec succès le répertoire spécifié par path.closedir() provoquant le core

if (opendir(MyDir) != NULL) 
    { 
    closedir((DIR *) MyDir); 
     exit 0; 
    } 
+0

Afficher plus de code, comment a été déclaré "MyDir"? Cela ne compile même pas ... – SoapBox

Répondre

2

MyDir doit être un const char* comme argument pour opendir.

Vous avez besoin du résultat de opendir pour passer à closedir - vous ne pouvez pas simplement lancer le chemin!

const char* MyDir = "/"; 
DIR* directory = opendir(MyDir); 
if (directory != NULL) 
{ 
    closedir(directory); 
    exit(0); 
} 
+0

Merci Douglas, j'ai la solution, Mon code fonctionne correctement maintenant. –

3

closedir()takes a DIR *, pas char *. Souhaitant closedir() cela ne va pas fonctionner. Essayez:

#include <sys/types.h> 
#include <dirent.h> 

DIR *dir; 
if ((dir = opendir(MyDir)) != NULL) 
    closedir(dir); 

En outre, il vous semble ajouté un casting en (DIR *) MyDir pour supprimer un avertissement du compilateur. Quand un compilateur vous donne un avertissement, vous devriez découvrir pourquoi il le fait. Supprimer l'avertissement n'est pas la bonne chose à faire.

+0

S'il vous plaît, n'utilisez pas '=' dans if. Même avec la parenthèse supplémentaire, c'est juste du mauvais code. –

+0

@Helltone: pourquoi est-ce mauvais code? Soin d'expliquer? Les parenthèses supplémentaires sont nécessaires dans ce cas. (J'aurais pu écrire 'if (dir = opendir (MyDir))' si j'allais écrire du mauvais code [par mon standard, certaines personnes pourraient le trouver parfaitement correct].) –

+0

Merci Alok, j'ai eu la réponse –

0

le modèle est incorrect. Pour référence:

opendir a besoin d'un nom de répertoire (char *) en tant que paramètre et retourne un flux de répertoire (DIR *):

DIR* opendir(const char* name) 

closedir a besoin d'un flux d'annuaire (DIR *) en tant que paramètre et retourne un int (0 en cas de succès):

int closedir(DIR* stream) 

donc, votre code devrait ressembler à:

const char* dirname; 
DIR* mydir; 

mydir = opendir(dirname); 
if(mydir != NULL) { 
    closedir(mydir); 
    exit(0); 
} 

Voir aussi: http://sunsson.iptime.org/susv3/functions/readdir.html