将从readdir()返回的字符串放入char **

时间:2012-10-25 02:36:33

标签: c unix memory-management

我想创建一个包含当前目录中所有常规文件的字符串数组

我有以下

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);

我尝试在每个元素上使用mallocing(在while循环中),因为我的文件夹中的常规文件数量没有预先确定。但是,我不断收到段错误。任何想法?

1 个答案:

答案 0 :(得分: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],然后将文件名绑定到其中。但是,这当然会给你一个内置的限制,你可以处理的文件数量,如果你只有几个文件要处理,会花费不必要的内存,虽然它只是指向你的额外费用,而不是字符串。< / p>