无法为指针的指针分配内存

时间:2021-01-07 09:47:47

标签: c pointers memory-management

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

在交流中

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]);
    }
}

我已经看过这些问题了:

1 个答案:

答案 0 :(得分:2)

什么情况是,存储器指针的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]);
    }
}