C语言 递归函数导致堆栈溢出



我有一段代码是工作的,除了它导致堆栈溢出。我知道这个问题是由递归引起的,但我不确定在这种情况下我能做些什么来阻止它。

代码:

void FindFilesRecursively(LPCTSTR lpFolder) {
TCHAR szFullPattern[MAX_PATH];
WIN32_FIND_DATA FindFileData;
HANDLE hFindFile;
PathCombine(szFullPattern, lpFolder, (L"*"));
hFindFile = FindFirstFile(szFullPattern, &FindFileData);
if (wcscmp(FindFileData.cFileName, L".") == 0){
FindNextFile(hFindFile, &FindFileData);
if (wcscmp(FindFileData.cFileName, L"..") == 0) {
FindNextFile(hFindFile, &FindFileData);
}
}
if (hFindFile != INVALID_HANDLE_VALUE) {
do {
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
// found a subdirectory; recurse into it
PathCombine(szFullPattern, lpFolder, FindFileData.cFileName);
printf("FOLDER: %Sn", szFullPattern);
FindFilesRecursively(szFullPattern);
}
printf("FILE: %Sn", FindFileData.cFileName);
} while (FindNextFile(hFindFile, &FindFileData));
FindClose(hFindFile);
}
printf("ENDn");
}

基本上它所做的一切它接受一个文件夹/文件路径作为参数,然后如果它是一个文件夹,它将打印名称,或者它将递归地遍历路径并打印所有内容。我的调试器在大约53次调用这个函数时遇到堆栈溢出。我不确定我应该在哪里/如何终止对这个函数的调用,这样它就不会导致堆栈溢出。

当您的代码到达空目录时,它将返回到父目录:

if (wcscmp(FindFileData.cFileName, L"..") == 0) {
FindNextFile(hFindFile, &FindFileData);
}
}
if (hFindFile != INVALID_HANDLE_VALUE) {

如果没有更多的条目,FindNextFile返回零,但您的代码不会检查它。由于hFindFile不是INVALID_HANDLE_VALUE,因此代码可以愉快地处理缓存的"…作为下一个找到的条目,但它将重定向到父文件夹(并最终生成SO)。下面是固定的代码:

void FindFilesRecursively(LPCTSTR lpFolder) {
TCHAR szFullPattern[MAX_PATH];
WIN32_FIND_DATA FindFileData;
HANDLE hFindFile;
PathCombine(szFullPattern, lpFolder, (L"*"));
hFindFile = FindFirstFile(szFullPattern, &FindFileData);
if (hFindFile != INVALID_HANDLE_VALUE) {
do {
if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0 && 
wcscmp(FindFileData.cFileName, L".") != 0 && 
wcscmp(FindFileData.cFileName, L"..") != 0) {
// found a subdirectory, and it's neither .. nor ..; recurse into it
PathCombine(szFullPattern, lpFolder, FindFileData.cFileName);
printf("FOLDER: %Sn", szFullPattern);
FindFilesRecursively(szFullPattern);
}
printf("FILE: %Sn", FindFileData.cFileName);
} while (FindNextFile(hFindFile, &FindFileData));
FindClose(hFindFile);
}
printf("ENDn");
}

最新更新