返回函数中文件/文件夹结构的指针

时间:2015-04-29 03:04:44

标签: c arrays winapi pointers struct

我正在尝试创建一个返回指向结构的指针数组的函数,但是在返回数组时我得到了奇怪的行为。这是结构:

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

这是我的功能。此函数打开一个给定的路径文件夹并返回其中包含的SubFolders。示例:“C:\”将返回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;   
};

当我打印找到文件夹时保存的结构信息时,它打印得很好,当文件夹查找周期结束并且我一个接一个地显示结构数组信息时,数组是一个奇怪的混乱,有时崩溃或有时只是正确打印第一个文件夹名称,其余部分用奇怪的符号打印。

2 个答案:

答案 0 :(得分:2)

声明变量'array'的方式,它在堆栈上创建,在函数外部无效。如果你想在这个函数之外使用它,你必须使用malloc为'array'分配空间。

答案 1 :(得分:2)

不允许在结构定义中包含=。无论如何,我不知道你想要做什么。结构定义如下所示:

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

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

这是没有希望的:

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

因为您正在返回指向局部变量的指针。函数返回时会销毁array。要使array的持续时间超过声明的函数,您必须将其设为static,或使用动态分配。

即使您解决了这个问题,另一个错误是:

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

FileInformation结构也是函数的本地结构,所以一旦函数退出,该指针将指向无效的内存。

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

考虑事物在内存中的位置,分配的时间以及指针指向的位置非常重要。在一块纸上画一个记忆图可能会有所帮助,这样你就可以看到变量的位置以及指向什么的。