Return 函数中 file/folder 结构的指针

Return pointer of file/folder struct in function

我正在尝试创建一个函数,该函数 return 是指向结构的指针数组,但在 return 数组时出现奇怪的行为。这是结构:

struct DLLs{
    char* FolderName = (char*)(malloc(sizeof(char*)*LongExtFileName));
    char* CppFileName = (char*)(malloc(sizeof(char*)*LongExtFileName));
};

这是我的职责。此函数打开给定的路径文件夹和 returns 它包含在其中的子文件夹。例子:"C:\"会return一个X大小的数组,其中array[0]->FolderName = "AMD", array[1] = "A_files"...等根据到 C:*.

中包含的任何计算机和文件夹
DLLs** GetFiles(char* DirPath, char* Extension){

    DLLs* arr[1]; //NULL struct in case there are wrong folders in given path
    arr[0] = (DLLs*)malloc(sizeof(DLLs*)*16);
    arr[0]->FolderName = "NULL";
    arr[0]->CppFileName = "NULL";

    char* path = (char*)(malloc(sizeof(char*)*LongExtFileName));
    path[0] = 0;

    strcat(path, DirPath);
    strcat(path, Extension); //This modifies the given path to search with WINAPI function
                             //path is changed to search files by: path\Extension, where Extension is a given extensión as \.cpp -> C:\*.cpp
                             //If extensions given by user is "\*" it will search folders

    int NumFiles; //Number of folders found
    void* rootPath;
    WIN32_FIND_DATA FileInformation;


    if ((rootPath = FindFirstFile((path), &FileInformation)) == INVALID_HANDLE_VALUE)       
        return arr; //Wrong folder path given

    else NumFiles = 0;

    do {
        if(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
            NumFiles++;
        }

    } while (FindNextFile(rootPath, &FileInformation));

    FindClose(rootPath);

    if(!(NumFiles-2)) return arr; //If not folders found, skipping "." and ".." folders, return null struct.

    DLLs* array[NumFiles - 2]; //Create array of pointers of structs of number of found folders
    int i = -1;

    rootPath = FindFirstFile(path, &FileInformation);
    FindNextFile(rootPath, &FileInformation);
    FindNextFile(rootPath, &FileInformation); //Skip "." and ".." folders

    do {
        if(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
            array[i] = (DLLs*)malloc(sizeof(DLLs*)*256); //Allocate struct memory
            array[i]->FolderName = FileInformation.cFileName;
            printf("%s\n", array[i]->FolderName);
                    //When printing names in this process, it shows folders names correctly in console.

    }

    } while (++i, FindNextFile(rootPath, &FileInformation));

    FindClose(rootPath);

    //Weird behavior starts here:
    printf("\n\nFolders Saved:\n\n");
    for(i = 0; i<NumFiles-2; i++)
    printf("%s\n", array[i]->FolderName);  

    return array;   
};

当我打印找到文件夹时保存的结构信息时,它打印得很好,当文件夹查找周期结束时,我做了一个 for 来一个一个地显示结构数组信息,数组是一个奇怪的混乱,有时会崩溃,有时它只会正确打印第一个文件夹名称,而其余的则带有奇怪的符号。

你声明变量的方式 'array',它是在堆栈上创建的,在你的函数之外是无效的。如果您想在此函数之外使用它,则必须使用 malloc 为 'array' 分配 space。

不允许在结构定义中包含 =。反正我不知道你想做什么。结构定义如下:

struct DLLs
{
    char *FolderName;
    char *CppFileName;
};

稍后您可以声明这种类型的变量并使该变量的指针指向某处。


这是无望的:

DLLs* array[NumFiles - 2];
// ...
return array;

因为您要返回一个指向局部变量的指针。 array在函数returns时被销毁。要使 array 比其声明的函数持续时间更长,您必须使其 static 或使用动态分配。

即使你修复了这个,另一个错误是:

array[i]->FolderName = FileInformation.cFileName;

FileInformation 结构也是函数的局部结构,因此一旦函数退出,该指针将指向无效内存。

要解决此问题,您可以再次使用动态分配,但您必须保持一致并动态分配所有 FolderName,以便稍后可以 free 它们。

考虑事物在内存中的位置、它们将分配多长时间以及指针指向何处非常重要。在一块泡儿上画一个内存图可能会有所帮助,这样你就可以看到变量在哪里,什么指向什么。