2017-10-10 24 views
1

J'utilise le code ci-dessous pour lister les fichiers dans un répertoire, puis les mettre dans une longue chaîne appelée filename_list. La logique estListe des noms de fichiers dans un répertoire et les mettre dans une chaîne - erreur de segmentation

  1. allouer un zéro caractère, char à zéro terminal * en utilisant strdup (« ») avant que la boucle

  2. augmenter sa taille à chaque itération en utilisant realloc() pour ce faire qui préserve le contenu existant. Je travaille sur combien de temps le nouveau tampon est en ajoutant l'ancienne longueur à la longueur du nom de fichier.

  3. J'ajoute le nom de fichier au tampon en utilisant strcat().

Cela fonctionne bien jusqu'à ce qu'il essaie d'appeler realloc() pour le nom de fichier final qui provoque une erreur seg.

Est-ce que quelqu'un sait ce que je fais mal? Serait-ce dû au fait qu'il n'y aurait pas assez de place pour la durée du 0 final?

#include <dirent.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 


char *filename_list; 

int main(void) 
{ 
    DIR   *d; 
    struct dirent *dir; 
    d = opendir("/home/johnbrady/binary_test"); 

    char *start = ""; 
    filename_list = strdup(start); //allocate a zero-character null-terminated char* to begin with 
    int filename_list_length; 

    filename_list_length = strlen(filename_list); //get length of filename list length 
    printf("size of filename list length is %d\n", filename_list_length); //print size of filename list length 

    if (d) 
    { 
    while ((dir = readdir(d)) != NULL) 
    { 

     printf("\n***************************************************\n"); 
     printf("Getting next file\n"); 
     int filename_length = strlen(dir->d_name); //get length of the filename 
     filename_list_length = strlen(filename_list); //get length of filename 
     printf("The value of filename list length is now %d\n", filename_list_length); 
     printf("\nthe length of the next filename is %d\n", filename_length); 
     printf("The file name is: %s\n", dir->d_name); 

     printf("\nresize the memory block for the file name list to be %d\n", filename_length + filename_list_length); 
     realloc(filename_list, filename_length + filename_list_length); //reallocate size to accomodate new filename 

     strcat(filename_list,dir->d_name); //append new filename to existing one 
     printf("The filename list is now %s\n", filename_list);  
     filename_list_length = strlen(filename_list); //get length of filename 
     printf("size of filename list length is now%d\n", filename_list_length); 
    } 

    closedir(d); 
    } 


    return(0); 
} 
+0

'realloc (filename_list, filename_length + filename_list_length);' => 'filename_list = realloc (filename_list, filename_length + filename_list_length);' –

+0

double possible de [Attention: ignorer la valeur de retour de 'realloc', a déclaré avec l'attribut prévenir \ _unused \ _result] (https://stackoverflow.com/questions/35190326/warning-ignoring-return-value-of-realloc-declared-with-attribute-warn-unused) –

+0

@ Jean-FrançoisFabre merci ou votre aimable Aidez-moi. –

Répondre

0

Vous n'êtes pas affecter la valeur de retour de realloc() (Valeur de retour: Un pointeur vers la mémoire réaffectés). C'est une erreur courante lors de l'utilisation de cette fonction.

Modifier ceci:

realloc(filename_list, filename_length + filename_list_length); 

à ceci:

filename_list = realloc(filename_list, filename_length + filename_list_length); 

Si vous avez compilé avec des avertissements activés, vous auriez été averti par votre ami, le compilateur:

avertissement: en ignorant la valeur de retour de 'realloc', d déclaré avec l'attribut warn_unused_result [-Wunused-result] realloc (strp-> données, nbytes);

+1

merci beaucoup. que je suis bête. –

+0

pas vraiment @articsol, j'ai fait la même erreur l'autre jour, vous êtes les bienvenus! – gsamaras

+0

maintenant avec votre badge d'or, vous pourriez dupehammer ce triple droit? –