Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C无法从函数外的字符串数组中读取_C_Arrays_Memory_Dirent.h - Fatal编程技术网

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

C无法从函数外的字符串数组中读取,c,arrays,memory,dirent.h,C,Arrays,Memory,Dirent.h,我编写了一个函数,它扫描目录并将其中的所有文件名复制到作为参数传递的char**,我使用dirent.h获取目录中的文件,下面是我的主要函数(&C): 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(fil

我编写了一个函数,它扫描目录并将其中的所有文件名复制到作为参数传递的
char**
,我使用
dirent.h
获取目录中的文件,下面是我的主要函数(&C):

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;
}
int main(无效)
{
字符**文件=0;
int size=0,i=0;
size=scanDir(文件,“C:\\Users\\user\\test”);
对于(i=0;id_name)+1);
strcpy(文件[i],ep->d_名称);
i++;
}
(无效)closedir(dp);
}
返回大小;
}
我正在使用visual studio,在调试
文件的过程中,
scanDir
中的[I]
在while循环的每次迭代中都包含正确的文件名,但在for循环中,它崩溃了,在变量watch中,它在
文件下说它“无法读取内存”


为什么会发生这种情况?

文件是按值传递的,因此当
scanDir
赋值并返回时,更改不会传播回调用方

恐怕您需要另一个间接层次(
char***


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

基本相同问题的其他实例:,。谢谢!我返回了一个包含数组的结构&它是size@Daniel.:哦,是的,很有道理:我忘了尺寸
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);
    ...
}