C无法从函数中读取字符串数组

C unable to read from array of strings out of function

我编写了一个扫描目录并将其中所有文件名复制到我作为参数传递的 char** 的函数,我正在使用 dirent.h 获取目录中的文件,这是我的主要功能:

int main(void)
{
    char** files = 0;
    int size = 0, i = 0;

    size = scanDir(files, "C:\Users\user\test");

    for (i = 0; i < size; i++)
    {
        puts(files[i]);
        free(files[i]);
    }

    free(files);

    getchar();  
    return 0;
}

int scanDir(char** files, char* path)
{
    int size = 0, i = 0;
    DIR* dp = 0;
    struct dirent* ep = 0;

    files = (char**)malloc(sizeof(char*) * size);
    dp = opendir(path);

    if (dp != NULL)
    {
        while (ep = readdir(dp))
        {
            files = realloc(files, sizeof(char*) * ++size);
            files[i] = (char*)malloc(sizeof(char) * (strlen(ep->d_name) + 1));
            strcpy(files[i], ep->d_name);
            i++;
        }
        (void)closedir(dp);
    }

    return size;
}

我正在使用 visual studio,在调试期间 files[i] scanDir 在 while 循环的每次迭代中确实包含正确的文件名,但在 for 循环中,它崩溃了变量 watch 它说它是 files

下的 "unable to read memory"

为什么会这样?

files 按值传递,因此当 scanDir 分配给它并且 returns 时,更改不会传播回调用者。

恐怕您需要另一个间接级别 (char***)。

int main(void)
{
    char** files = 0;
    size = scanDir(&files, "C:\Users\user\test");
    ...
}

int scanDir(char*** files, char* path)
{
    ...
    *files = (char**)malloc(sizeof(char*) * size);
    ...
}

或者,您可以将 scanDir 签名更改为 return 新分配的 char** 指针以及大小。