2017-09-26 14 views
0

以下のコードでは、ファイル名をchar**というディレクトリに格納しています(files)。最終的には、私はこれらのファイル名のすべてをただ一つのchar*に保存する必要があります。だから私が論理的に必要と考えるのは、これらの文字列がどのくらいのメモリを占有しているのかを調べてから、このサイズのchar*を割り当てることです。私は、ヒープ技法からの割り当てに慣れていません。 char**がどのくらいのメモリを占有しているかを判断するにはどうすればよいですか?C char **が占めるメモリの量を決定する方法

#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

malloc()は既知のバイト数なので、それを追跡しないでください。あなたが* ALL *要素を0に初期化したいと確信していないか、本当に**あなたがしていることを知っていない限り、 'calloc()'を使用してください。 –

答えて

2

malloc編ポインタが指すメモリ領域に必要なサイズを取得するには何の移植方法はありません。

これらのサイズを明示的に管理して追跡する必要があります。可能な方法は、それらを含んでいる(または他の場所にそのサイズを保持する、またはそれを再計算する)ために、structを含めることです。 flexible array memberstructを終了することもできます。

すべての場合、これにはの表記規則が必要です。少なくともコメントには明示的に明示してください。

BTW、callocおよびmallocは(NULLを返して)失敗する可能性があります。あなたは常にそれをチェックすべきです。

0

ファイル名の数は知っていますか? strlenを使用すると、各文字列の長さを見つけることができます。文字列の実際の最小割り当て長は、ヌルターミネータのstrlen + 1です。すべてのファイル名を1つの長い文字列にコピーする予定がある場合は、それぞれの終わりにヌルターミネーターを付けることは望ましくありませんが(それは単一のCスタイルの文字列ではありません)、おそらく他の種類デリミタの長さを含める必要があります。

したがって、文字列をループして長さを合計します。それぞれに必要な長さはstrlen + <length of delimiter>です(末尾の文字列の区切りをスキップする可能性があります)。

関連する問題