我正在尝试创建一个返回指向结构的指针数组的函数,但是在返回数组时我得到了奇怪的行为。这是结构:
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;
};
当我打印找到文件夹时保存的结构信息时,它打印得很好,当文件夹查找周期结束并且我一个接一个地显示结构数组信息时,数组是一个奇怪的混乱,有时崩溃或有时只是正确打印第一个文件夹名称,其余部分用奇怪的符号打印。
答案 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
。
考虑事物在内存中的位置,分配的时间以及指针指向的位置非常重要。在一块纸上画一个记忆图可能会有所帮助,这样你就可以看到变量的位置以及指向什么的。