C 将数据动态复制到二维字符数组时发生访问冲突
请参考我的递归代码,该代码解析具有大量文件的目录。代码复制字符数组中的所有文件路径。我是否在递归调用中遗漏了一些访问冲突?提前谢谢C 将数据动态复制到二维字符数组时发生访问冲突,c,windows,recursion,C,Windows,Recursion,请参考我的递归代码,该代码解析具有大量文件的目录。代码复制字符数组中的所有文件路径。我是否在递归调用中遗漏了一些访问冲突?提前谢谢 // 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
// 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;
}
//全局变量
int iFileCount=0;
char*szFilePath[MAX_PATH];
//递归函数以获取指定路径中的所有文件
void findFileRec(const char*szDir)
{
int i,iRet;
处理高频风;
char sPath[MAX_PATH];
WIN32_查找_数据ffd;
大整数文件大小;
sprintf(sPath,“%s\\*.*”,szDir);
hFind=FindFirstFile(sPath和ffd);
if(无效的句柄值==hFind)
{
_tprintf(文本(“FindFirstFile错误”);
返回;
}
i=0;
对于(i;;i++)
{
如果((strcmp(ffd.cFileName,“.”!=0)和&(strcmp(ffd.cFileName,“…”)!=0))
{
sprintf(sPath,“%s\\%s”,szDir,ffd.cFileName);
if(ffd.dwFileAttributes和文件属性目录)
{
_tprintf(文本(“\n%s\n”),ffd.cFileName);
{
FindFileRec(sPath);
}
}
其他的
{
filesize.LowPart=ffd.nFileSizeLow;
filesize.HighPart=ffd.nFileSizeHigh;
_tprintf(文本(“\n%s%ld字节\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);
如果(0==iRet)
{
打破
}
}
FindClose(hFind);
返回;
}
问题与递归函数完全无关,递归函数似乎工作正常(但我没有详细检查)
char*szFilePath[MAX_PATH]
声明指向char*
的MAX\u PATH
指针数组。因此,只要iFileCount
超过值MAX\u 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
}
char*szFilePath[MAX_PATH];
国际金融账户;
void foo()
{
字符sPath[]=“条”;
szFilePath[iFileCount]=(char*)malloc(sizeof(char)*strlen(sPath)+1;
szFilePath[iFileCount][strlen(sPath)]='\0';
memcpy(szFilePath[iFileCount],sPath,strlen(sPath));
iFileCount++;
}
int main()
{
对于(int i=0;i<100000;i++)
foo();//如果超过MAX_路径,则出现问题
}
这也会像你的程序一样失败
您需要以不同的方式处理
szFilePath
。调试器告诉了您什么?它在哪里坠毁的?如何调用该函数?什么是iFileCount
A和szFilePath
?它们是如何初始化的,在哪里初始化的?请提供递归调用中的崩溃:findFileRec(sPath);iFileCount将是文件总数。szFilePath是一个字符数组,存储所有文件路径这里是szFilePath
的声明?你可以考虑做一个完整的例子,这样我们就能准确地看到你所看到的。这只需要几行代码。有超过260个文件吗?您没有检查是否超过szFilePath
的结尾,因此我的水晶球显示您正在覆盖内存。将其作为局部函数添加不起作用,它是一个递归函数。请举一个完整的例子。@Sarju您上次的编辑完全修改了程序的行为,它必须保持全局性。谢谢您的解释。这里的问题是,我没有预先计算文件的数量,我需要在szFilePath中动态添加文件路径。另外,我不能先运行程序来获取文件的数量。这会很费时。有什么建议我可以这样做吗?大致如下:使用malloc
和realloc
。例如,使用szFilePath=malloc(100*sizeof(char*))
为100个指针分配空间,并且一旦iFileCount
为=100
使用szFilePath=realloc((iFileCount+100)*sizeof(char*)分配更多空间代码>等等。这是一个很好的练习。像这样声明szFilePath
char*szFilePath
,最好将其重命名为其他名称,sz
前缀具有误导性。谢谢。可以试试:)“像这样声明char*szFilePath;
”你确定吗?我会给它另一个*
@Sarju不是char*szFilePath
而是char**szFilePath代码>。打字错误。