0

現在のディレクトリにあるすべての通常のファイルを保持する文字列の配列を作成したいと思います

私は次のものを持っています

DIR *d = opendir(".");
struct dirent *dirent;
struct stat fileStat;
char **files;

while (dirent = readdir(d)) {
    stat(dirent->d_name, &fileStat);

    if (S_ISREG(fileStat.st_mode)) {

    }

}

closedir(d);

フォルダー内の通常のファイルの数が事前に決定されていないため、外出先で (while ループで) 各要素を malloc しようとしました。ただし、セグメンテーション違反が発生し続けます。何か案は?

4

1 に答える 1

0

問題は、文字列へのポインタ用のメモリも割り当てられていないことです。

文字列へのポインターを保持するために malloc と remallocを実行filesしてから、各文字列を個別に malloc するか、代わりに strdup を使用してそれを行う必要があります。

size_t files_length = 0;
size_t files_capacity = 16;
char **files = (char**)malloc(files_capacity*sizeof(*files));
if (files == NULL)
    explode();

while (...) {
    if (...) {
        if (files_capacity < files_length + 1) {
            files = (char**)remalloc(files, files_capacity*2*sizeof(*files));
            if (files == NULL) {
                explode();
            }
            files_capacity *= 2;
        }
        files_index = files_length++;
        files[files_index] = strdup(...);
    }
}

// free everything

または、次filesのようなポインターの大きな配列を作成char *files[1024]してから、ファイル名を strdup することもできます。ただし、もちろん、処理できるファイルの数に組み込みの制限があり、処理するファイルが数個しかない場合は不要なメモリが消費されますが、余分なコストがかかるのはポインターだけであり、文字列ではありません。

于 2012-10-25T02:40:21.577 に答える