c-使用SDL_strdup等获取文件名时出现问题



我正试图用SDL2创建一个程序。
在代码的某个部分,我正在编写一些函数来获取给定目录路径中所有现有文件的名称(并将它们保存在内存中),这样,在另一个函数中,我可以检查在检查目录的最后一刻是否存在指定的文件。我使用dirent.h来满足我的需求,但我遇到了一些问题:

  1. 所有文件都由readdir()正确捕获(无一例外),但在使用SDL_strdup()后,它们并不是总是正确复制到内存中(代码如下)
  2. 我使用SDL_malloc()/SDL_realloc()/SDL_strdup()尽可能跨平台,以避免在移植代码时出现问题(因为我读到strdup不是C标准)

这是我的代码:

typedef struct FileList {
    char **files;
    size_t num;
} FileList;
FileList *GetFileList(const char *path){
struct dirent *dp = NULL;
DIR *dir = NULL;
size_t i = 0;
FileList *filelist = SDL_malloc(sizeof(FileList)); /* changing this to a calloc doesn't help */
/* Check if filelist == NULL */
filelist->files = NULL;
dir = opendir(path);
/* Check if dir == NULL */
while ((dp = readdir(dir))){
    if (dp->d_name[0] == '.'){
        continue;    /* skip self, parent and all files starting with . */
    }
    printf("Copying: %sn", dp->d_name); /* Always show the name of each file */
    filelist->files = SDL_realloc(filelist->files, ++i);
    filelist->files[i-1] = SDL_strdup(dp->d_name);
    printf("Copied: %snn", filelist->files[i-1]); /* Varies: either shows the file's name, either gives me plain gibberish or just nothing */
}
filelist->num = i;
closedir(dir);
return filelist;

}

输出各不相同。当它没有崩溃时,我要么正确地复制了所有文件名,要么复制了大部分文件名,有些文件名中什么都不包含或只是胡言乱语(如评论所述);如果它真的崩溃了,有时我在使用SDL_strdup()时会得到Segfault,其他时候我在使用closedir()时会得到Segfault。

我甚至考虑过用filelist->files的初始内存分配来交换SDL_realloc()场景,方法是给它文件数量(多亏了另一个函数),但我遇到了同样的问题。

任何将我的编码风格改为更具防御性的建议(因为我确实认为这种风格相当危险)都将受到赞赏,尽管我已经为这种情况尽了全力。我目前正在使用内置的gcc Apple LLVM 6.0(clang-600.0.56)开发Mac OS X。

您需要指针空间,sizeof(char *) != 1因此

filelist->files = (char**) SDL_realloc(filelist->files, ++i);

需要

filelist->files = SDL_realloc(filelist->files, ++i * sizeof(char *));

但这实际上是个坏主意,因为SDL_realloc可能会返回NULL,在这种情况下,您将失去对原始指针的引用,所以一个好的方法是

void *ptr;
ptr = SDL_realloc(filelist->files, ++i * sizeof(char *));
if (ptr == NULL)
    handleThisErrorAndDoNotContinue();
filelist->files = ptr;

如果分配器函数返回NULL,请始终检查它们,因为您无法控制要读取的数据的大小,而且至少在理论上可能会耗尽内存,因此您应该通过检查这些函数的成功来确保代码的安全。

相关内容

  • 没有找到相关文章

最新更新