c - 将数据动态复制到二维字符数组时发生访问冲突

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

最佳答案

这个问题与递归函数完全无关,递归函数似乎工作正常(尽管我没有检查细节)。

char *szFilePath[MAX_PATH]; 声明一个指向 char*MAX_PATH 指针数组。因此,一旦 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

关于c - 将数据动态复制到二维字符数组时发生访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46711225/

相关文章:

c - 如何实例化GdkDeviceManager?

c - 超过超时限制后未从 alarm() 触发信号处理程序

C 解析函数不起作用

php - 为什么我修改 php.ini 文件以启用 extension=php_pdo.dll、extension=php_pdo_mysql.dll 后会回显 "pdo support is NOT loaded"?

c++ - 比特币、MinGW、Windows 7、Makefile 错误

javascript - Vue组件中的递归组件错误

c - 这是一个有效的 Tic Tac Toe 获胜条件检查器功能吗?

windows - 如何使用需要特定文件名的 CLI 工具在批处理脚本中使用通配符?

c++ - 为什么我的递归函数中的循环是无限的?

javascript - 无序列表 "merging"通过递归函数问题