2017-09-26 7 views
0

Le code ci-dessous stocke les noms de fichiers dans un répertoire char** - appelé files. En fin de compte, j'ai besoin de stocker tous ces noms de fichiers dans un seul char*. Donc, la première chose que je pense que je dois logiquement faire est de trouver combien de mémoire occupe ce tableau de chaînes et d'allouer ensuite un char* de cette taille. Je ne suis pas très familier avec l'attribution des techniques de tas. Comment peut-on déterminer la quantité de mémoire occupée par un char**?C comment déterminer combien de mémoire un char ** occupe

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

size_t file_list(const char *path, char ***ls) { 
    size_t count = 0; 
    size_t length = 0; 
    DIR *dp = NULL; 
    struct dirent *ep = NULL; 

    dp = opendir(path); 
    if(NULL == dp) { 
     fprintf(stderr, "no such directory: '%s'", path); 
     return 0; 
    } 

    *ls = NULL; 
    ep = readdir(dp); 
    while(NULL != ep){ 
     count++; 
     ep = readdir(dp); 
    } 

    rewinddir(dp); 
    *ls = calloc(count, sizeof(char *)); 

    count = 0; 
    ep = readdir(dp); 
    while(NULL != ep){ 
     (*ls)[count++] = strdup(ep->d_name); 
     ep = readdir(dp); 
    } 

    closedir(dp); 
    return count; 
} 

int main(int argc, char **argv) { 

    char **files; 
    size_t count; 
    int i; 

    count = file_list("/home/rgerganov", &files); 
    for (i = 0; i < count; i++) { 
     printf("%s\n", files[i]); 
    } 
} 
+0

Vous 'malloc()' un nombre d'octets connu, alors pourquoi ne pas le garder en mémoire? utilisez 'calloc()' sauf si vous êtes sûr à 100% que vous voulez initialiser * TOUS * les éléments à 0 ou, ** vous ** savez vraiment ce que vous faites. –

Répondre

2

Il n'y a aucun moyen portable pour obtenir la taille requise pour une zone de mémoire pointée par un pointeur ed malloc.

Vous devez gérer et suivre ces tailles explicitement. Un moyen possible est d'en avoir struct les contenant (ou de conserver cette taille ailleurs, ou de la recalculer). Vous pouvez même mettre fin à cette struct avec un flexible array member.

Dans tous les cas, vous avez besoin de conventions pour cela. Mieux les expliciter, au moins dans les commentaires.

BTW, calloc et malloc peuvent échouer (en retournant NULL). Vous devriez toujours vérifier cela.

0

Vous savez combien de noms de fichiers vous avez. Vous pouvez utiliser strlen pour trouver la longueur de chaque chaîne. La longueur allouée minimum réelle pour une chaîne est le strlen + 1, pour le terminateur null. Si vous envisagez de copier tous les noms de fichiers dans une longue chaîne, vous ne voudrez probablement pas de terminaison nulle à la fin de chaque chaîne (ce ne sera pas une seule chaîne de style C), mais vous voudrez probablement d'autres types de délimiteur, dont vous devrez inclure la longueur.

Ainsi, vous parcourez les chaînes en faisant la somme des longueurs. La longueur nécessaire pour chacun est strlen + <length of delimiter> (en ignorant éventuellement le délimiteur de la toute dernière chaîne.)