麻烦的2D数组realloc堆错误

时间:2014-04-04 15:46:16

标签: c visual-studio heap realloc

以下是代码段。

背景:修改旧的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;
        }           
    }                    
     } 

}

0 个答案:

没有答案