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
它们。
考虑事物在内存中的位置、它们将分配多长时间以及指针指向何处非常重要。在一块泡儿上画一个内存图可能会有所帮助,这样你就可以看到变量在哪里,什么指向什么。
我正在尝试创建一个函数,该函数 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
它们。
考虑事物在内存中的位置、它们将分配多长时间以及指针指向何处非常重要。在一块泡儿上画一个内存图可能会有所帮助,这样你就可以看到变量在哪里,什么指向什么。