我想创建一个字符串数组来保存当前目录中的所有常规文件
我有以下内容
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/