将数据动态复制到2D字符数组时发生访问冲突

时间:2017-10-12 13:43:54

标签: 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;
    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;
}

1 个答案:

答案 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