以下是代码段。
背景:修改旧的C windows应用程序以与新仪器通信(同时保持尽可能多的旧代码),这需要添加新功能。在这种情况下,我将文件名从目录复制到2D数组中,以填充文件名列表。
在调试时,程序进入realloc调用(第二个realloc,因为第一个被if语句跳过),然后打破下面代码片段之前的错误。
在realloc时,已经分配了WFMLIST,第一个元素初始化为0,NbItemWFMLIST = 1.所以我的问题是,有人知道为什么会出现这个错误吗?在添加目录搜索和复制组件之前,内存分配和重新分配工作正常。是DLL相关吗?我尝试过很多东西(来自Stackoverflow上类似错误的建议),包括用free()和calloc()替换realloc并收到同样的错误。
此外,ffd正确查找目录并在ffd.cFileName中提供相应的字符串。
如果我能提供更多信息,请告诉我。感谢。
HEAP [vhf.exe]:堆积在01068980处修改为01068989过去 请求的大小为1 Windows已在vhf.exe中触发断点。
这可能是由于堆的损坏,这表明存在错误 vhf.exe或它加载的任何DLL。
这也可能是由于用户在vhf.exe具有焦点时按下F12。
char **WMFLIST=NULL;
long int NbItemWFMLIST = 0;
unsigned int playback_bytes;
WIN32_FIND_DATA ffd; //Added for directory search
LARGE_INTEGER filesize; //
TCHAR szDir[MAX_PATH]; //
TCHAR *pwrkDir;
size_t length_pwrkDir;
HANDLE hFind = INVALID_HANDLE_VALUE;
pwrkDir = (TCHAR *)calloc(5, sizeof(TCHAR));
if(WFMLIST==NULL)
{
WFMLIST=(char **)calloc(NbItemWFMLIST,sizeof(char *));
if(WFMLIST != NULL)
{
WFMLIST[0]=(char *)calloc(13,sizeof(char));
if(WFMLIST[0]==NULL)
{
MessageBox(hWnd,"CALLOC WMLIST[0]==NULL","Memory allocation error",MB_OK);
NbItemWFMLIST=0;
return(0); **error check
}
else
{
NbItemWFMLIST=1;
sprintf_s(&WFMLIST[NbItemWFMLIST-1][0],MAX_PATH,"\0");
}
}
else
{
**error
}
}
else
{
WFMLIST = (char **)realloc((void *) WFMLIST,sizeof(char *));
if(WFMLIST==NULL)
{
**error check
}
else
{
NbItemWFMLIST=1;
sprintf(&WFMLIST[NbItemWFMLIST-1][0],"\0");
}
}
if((tawg->status = GetCurrentDirectory(MAX_PATH,pwrkDir))==SIG_SUCCESS) //Locate the current working directory
{
**Error check
}
sprintf_s(pwrkDir, MAX_PATH, "%s\\Waveforms", pwrkDir); //Append directory with Waveform folder
strcpy(szDir, pwrkDir);
strcat(szDir,"\\*");
hFind = FindFirstFile(szDir, &ffd);
if (INVALID_HANDLE_VALUE == hFind)
{
**error check
}
while (FindNextFile(hFind, &ffd) != 0);
{
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
**error check
}
else
{
WFMLIST=(char **)realloc((void*)WFMLIST,((NbItemWFMLIST+1)*sizeof(char *)));
if (WFMLIST[NbItemWFMLIST]==NULL)
{
**error
}
else
{
WFMLIST[NbItemWFMLIST]=(char *)calloc(13,sizeof(char));
if (WFMLIST[NbItemWFMLIST]==NULL)
{
**error
}
else
{
sprintf(&WFMLIST[NbItemWFMLIST][0],"%s",ffd.cFileName);
NbItemWFMLIST=NbItemWFMLIST+1;
}
}
}
}