Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将数据动态复制到二维字符数组时发生访问冲突_C_Windows_Recursion - Fatal编程技术网

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。打字错误。