无法将内存分配给指针的指针

Failing to assign memory to a pointer of a pointer

我的问题是无法将内存分配给 (char*) 指针,我似乎不明白为什么。 我回顾了其他类似的问题,但我似乎无法掌握答案。 我正在尝试 return 一个字符串列表,但我知道在 C 中我不能 return char**,但我可以通过 char** 参数做到这一点。我的尝试在下面的代码片段中。

在a.c

void list(char** fileList) {
    int fileIndex = 0;
    fileList = (char**)malloc(DIRECTORY_SIZE * sizeof(char*));
    while ((dir = readdir(currentDirectory)) != NULL)
    {
       fileList[fileIndex] = (char*)malloc(FILENAME_LENGTH * sizeof(char)); //It fails here
       fileList[fileIndex] = strncpy(fileList[fileIndex], dir->d_name, FILENAME_LENGTH);
       fileIndex++;
       printf("%s\n", fileList[fileIndex]);
    }
}

在main.c

int main() {
    char** fileList;
    list(fileList);
    for(int i = 0; i < 10; i++) {
        printf("%s\n", fileList[i]);
    }
}

我已经看过这些问题了:

发生的事情是内存指针 fileList 被复制到列表函数,当列表函数随后更改指针时,但初始指针不会改变。

要解决此问题,您可以给它一个指向指针的指针以更改实际指针值,如下所示:

void list(char*** fileList) {
    int fileIndex = 0;
    *fileList = (char**)malloc(DIRECTORY_SIZE * sizeof(char*));
    while ((dir = readdir(currentDirectory)) != NULL)
    {
       *fileList[fileIndex] = (char*)malloc(FILENAME_LENGTH * sizeof(char)); //It fails here
       *fileList[fileIndex] = strncpy(fileList[fileIndex], dir->d_name, FILENAME_LENGTH);
       fileIndex++;
       printf("%s\n", fileList[fileIndex]);
    }
}

int main() {
    char** fileList;
    list(&fileList);
    for(int i = 0; i < 10; i++) {
        printf("%s\n", fileList[i]);
    }
}

但我个人觉得这样有点笨拙,所以最好这样做:

char** list(void) {
    char** fileList;
    int fileIndex = 0;
    fileList = (char**)malloc(DIRECTORY_SIZE * sizeof(char*));
    while ((dir = readdir(currentDirectory)) != NULL)
    {
       fileList[fileIndex] = (char*)malloc(FILENAME_LENGTH * sizeof(char)); //It fails here
       fileList[fileIndex] = strncpy(fileList[fileIndex], dir->d_name, FILENAME_LENGTH);
       fileIndex++;
       printf("%s\n", fileList[fileIndex]);
    }
    return filelist;
}

int main() {
    char** fileList = list();
    for(int i = 0; i < 10; i++) {
        printf("%s\n", fileList[i]);
    }
}