Я пытаюсь создать программу с SDL2.
В определенной части кода я пишу функции для захвата имен всех существующих файлов в указанном пути к каталогу (и сохраняю их в памяти), чтобы в другой функции я мог проверить, присутствует ли указанный файл в последний момент был проверен каталог. Я использую dirent.h
, чтобы удовлетворить свои потребности, но я бегу в несколько проблем:Проблемы с захватом имен файлов с помощью SDL_strdup и аналогичных
- Все файлы должным образом захвачены
readdir()
(без исключения), однако они не всегда должным образом скопированы память после использованияSDL_strdup()
(код ниже). - Я использую
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: %s\n", 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: %s\n\n", 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;
}
Выход изменяется. Когда он не падает, я либо правильно копирую все имена файлов, либо получаю большинство из них, а некоторые не содержат ничего или простой тарабарщины (как прокомментировано); если он падает, иногда я получаю Segfault при использовании SDL_strdup()
, в других случаях я получаю Segfault при использовании closedir()
.
Я даже подумал об обмене сценария SDL_realloc()
с начальным распределением памяти filelist->files
, указав ему количество файлов (благодаря другой функции), но я получаю ту же проблему.
Любое предложение изменить стиль кодирования на более защитный (так как я считаю, что это довольно опасно) будет оценено, хотя я пробовал все, что мог, для этого случая. В настоящее время я работаю над Mac OS X, используя встроенный gcc Apple LLVM 6.0 (clang-600.0.56).
Вам не нужно вводить из 'void *' в любой тип указателя, приведение в действие не требуется. –
Меня учили в колледже, поскольку они утверждали, что это старый, но оборонительный способ программирования. Я также считал, что это не нужно, поэтому я приму ваше предложение. – Keyaku
[Это считается плохим стилем] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) –