我在使用下面的代码时遇到了一些麻烦,它可以将文件夹的路径作为输入(在我的情况下为“pack”)并将路径放到它可以在文件夹或子文件夹中找到的每个.wav文件中一个字符串数组。
您可以在下面看到的代码崩溃。
在向你们提供一些帮助之前我自己搜索并且在第二个子文件夹中尝试重新分配该文件夹的第一个文件时崩溃似乎会附加
我正在测试的文件夹结构如下:
pack
├── _subfolder1
| ├── wavefile1.wav
| ├── wavefile2.wav
| └── wavefile3.wav
├── _subfolder2
| └── wavefile4.wav
├── _subfolder3
| ├── wavefile5.wav
| └── wavefile6.wav
代码:
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
void find_dir_content(char* path, char** filepathlist, int* size)
{
DIR* d = opendir(path);
if(d == NULL)
return;
struct dirent* dir;
while((dir = readdir(d)) != NULL)
{
int isdir = 0;
DIR* tmp;
char f_path[255];
sprintf(f_path, "%s/%s", path, dir->d_name);
if((tmp = opendir(f_path))) {
closedir(tmp);
isdir = 1;
}
if(!isdir) {
char *dot = strrchr(dir->d_name, '.');
if (dot && !strcmp(dot, ".wav")){
char** tmp = realloc(filepathlist, sizeof(char*) * ((*size) + 1));
if (tmp == NULL)
{
return;
}
else
{
filepathlist = tmp;
}
char d_path[256];
sprintf(d_path, "%s/%s", path, dir->d_name);
filepathlist[*size] = d_path;
//printf("%d : %s\n", *size, filepathlist[*size]);
(*size)++;
}
}
else if(isdir && strcmp(dir->d_name, ".") != 0 &&
strcmp(dir->d_name, "..") != 0)
{
char d_path[256];
sprintf(d_path, "%s/%s", path, dir->d_name);
//printf("%s\n", d_path);
find_dir_content(d_path, filepathlist, size);
}
}
closedir(d);
}
int main(int argc, char** argv)
{
int sizefilepathlist = 0;
char** filepathlist = (char**) malloc(0*sizeof(char*));
find_dir_content("pack", filepathlist, &sizefilepathlist);
for(int i = 0; i< sizefilepathlist; i++){
printf("%s", filepathlist[i]);
}
return 0;
}
编辑:我在Windows上,我使用minGW(gcc)的codelite,并且没有错误消息,Windows只是给了我旧的“已经停止工作”错误。
答案 0 :(得分:0)
正如@unwind在评论中指出的那样:
您正在存储本地变量的地址。那会让你得到不确定的行为。您必须为路径本身动态分配空间,而不仅仅是指向它的指针。
最小的变化是改变线:
filepathlist[*size] = strdup(d_path); // d_path will go out of scope - copy the string to dynamically allocated memory.
到
#include <string.h>
确保strdup
获取realloc(filepathlist)
的原型。
修改强>
另一个问题是,main
时find_dir_content
中的变量仍指向旧位置。这可以通过让filepathlist
返回char **filepathlist(...) {
...
return filepathlist;
}
:
filepathlist = find_dir_content("pack", filepathlist, &sizefilepathlist);
并在主要:
$post = factory(Post::class)->create();
$first_tag = factory(Tag::class)->create();
$second_tag = factory(Tag::class)->create();
$post->tags()->attach($first_tag);
$post->tags()->attach($second_tag);
$this->assertEquals(2, $post->tags->count());