请参考我的递归代码,该代码解析具有大量文件的目录。代码复制字符数组中的所有文件路径。我错过了在递归调用中遇到访问冲突的内容吗?提前致谢
// global variables
int iFileCount = 0;
char *szFilePath[MAX_PATH];
// Recursive function to get all files in the path specified
void FindFilesRec(const char *szDir)
{
int i, iRet;
HANDLE hFind;
char sPath[MAX_PATH];
WIN32_FIND_DATA ffd;
LARGE_INTEGER filesize;
sprintf(sPath, "%s\\*.*", szDir);
hFind = FindFirstFile(sPath, &ffd);
if (INVALID_HANDLE_VALUE == hFind)
{
_tprintf(TEXT("FindFirstFile error"));
return;
}
i = 0;
for (i;;i++)
{
if ((strcmp(ffd.cFileName, ".") != 0) && (strcmp(ffd.cFileName, "..") != 0))
{
sprintf(sPath, "%s\\%s", szDir, ffd.cFileName);
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
_tprintf(TEXT("\n %s <DIR>\n"), ffd.cFileName);
{
FindFilesRec(sPath);
}
}
else
{
filesize.LowPart = ffd.nFileSizeLow;
filesize.HighPart = ffd.nFileSizeHigh;
_tprintf(TEXT("\n %s %ld bytes\n"), ffd.cFileName, filesize.QuadPart);
szFilePath[iFileCount] = (char *)malloc(sizeof(char) * strlen(sPath) + 1);
szFilePath[iFileCount][strlen(sPath)] = '\0';
memcpy(szFilePath[iFileCount], sPath, strlen(sPath));
iFileCount++;
}
}
iRet = FindNextFile(hFind, &ffd);
if (0 == iRet)
{
break;
}
}
FindClose(hFind);
return;
}
答案 0 :(得分:1)
这个问题与递归函数完全无关,它似乎运行正常(虽然我没有详细检查)。
char *szFilePath[MAX_PATH];
声明MAX_PATH
指向char*
的数组。因此,只要iFileCount
超过值MAX_PATH
,就会开始覆盖内存,这会导致未定义的行为。
你基本上是这样做的:
char *szFilePath[MAX_PATH];
int iFileCount;
void foo()
{
char sPath[] = "bar";
szFilePath[iFileCount] = (char *)malloc(sizeof(char) * strlen(sPath) + 1);
szFilePath[iFileCount][strlen(sPath)] = '\0';
memcpy(szFilePath[iFileCount], sPath, strlen(sPath));
iFileCount++;
}
int main()
{
for (int i = 0; i < 100000; i++)
foo(); // problem if i exceeds MAX_PATH
}
这也将失败,就像你的程序一样。
您需要以不同的方式处理szFilePath
。