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

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

我尝试动态分配(在 while 循环中)每个元素,因为我的文件夹中的常规文件数量不是预先确定的。但是,我不断遇到段错误。有什么想法吗?

最佳答案

问题在于,甚至连指向字符串的指针的内存也没有分配。

您需要 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 到其中。但是,这当然会给您可以处理的文件数量带来内置限制,并且如果您只有几个文件需要处理,则会消耗不必要的内存,尽管只是指针而不是字符串会增加您的额外成本。

关于c - 将从 readdir() 返回的字符串放入 char **,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13060764/

相关文章:

c - 编写打印人类可读时间的内核系统调用

linux - 如何通过命令行列出昨天在目录中修改的文件?

bash - 如何编写调用带有构造文件名参数的 grep 命令的 bash 函数

regex - [A-Z] 是什么意思 [A-Za-z]?

image - WebGL - 如何渲染大纹理?

c - MpLab C、汇编、中断定义冲突

c - 我如何在 c 中创建哈希表的动态数组

C++ 变量/对象和堆内存管理

c - 排序文本文件

java - 哪个更有效率? (垃圾收集)