调用memcpy时发生异常,提示"enter the path for MEMCPY.ASM"

boylovesports 2012-07-27 02:57:00
程序运行时,提示“0x05cb8253"指令引用的"0x00000000"内存,该内存不能为"written".
调试运行时,如下代码<1>处memcpy可正常运行通过,到<2>时,弹出消息对话框“Unhandled exception in Hpx301F.exe(MSVCRTD.DLL):0xC0000005: Access Violation." 点确定后弹出“Please Enter the path for MEMCPY.ASM"的一个对话框,请问该如何处理。

if(pSheet->fSideOffset!=0xFFFFFFFF && pSheet->bSideOffset!=0xFFFFFFFF)
{
lFSideLength=pSheet->bSideOffset-pSheet->fSideOffset;
<1> memcpy(pFSideBuffer,tempBuf+pSheet->fSideOffset,pSheet->bSideOffset-pSheet->fSideOffset);
lBSideLength=mLen-pSheet->bSideOffset;
<2> memcpy(pBSideBuffer,tempBuf+pSheet->bSideOffset,mLen-pSheet->bSideOffset);
pTheBuffer=pFSideBuffer;
}
...全文
3451 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2012-07-27
  • 打赏
  • 举报
回复
memset(pBSideBuffer,0xFF,256); //清零
这句的错误结果可能要到后面才出现。
boylovesports 2012-07-27
  • 打赏
  • 举报
回复
那我把他改成200k的试一下,让我纳闷的是memcpy(pFSideBuffer,tempBuf+pSheet->fSideOffset,pSheet->bSideOffset-pSheet->fSideOffset); //将正面格
这个怎么就可以通过。他的试着跟pBsideBuffer完全相同啊
schlafenhamster 2012-07-27
  • 打赏
  • 举报
回复
pBSideBuffer=new char[0x200000]; //分配存储空间
是pBSideBuffer=NULL,不是他的内容;
如果pBSideBuffer==NULL,那么下面一句就会有问题。
memset(pBSideBuffer,0xFF,256); //清零 FF 256 个? new是 200K
boylovesports 2012-07-27
  • 打赏
  • 举报
回复
pBSideBuffer=new char[0x200000]; //分配存储空间
memset(pBSideBuffer,0xFF,256); //清零
我这样给他赋初值了,还有可能返回NULL么?
schlafenhamster 2012-07-27
  • 打赏
  • 举报
回复
pBSideBuffer=new char[0x200000];
可能返回NULL,你要检查的!
boylovesports 2012-07-27
  • 打赏
  • 举报
回复
这两个属于并列关系,通过判断条件来赋值,如果pBSideBuffer=NULL 了就执行不到memcpy这一步了,
只有 pBSideBuffer=new char[0x200000] 才能执行到memcpy
你觉得是 if(pSheet->fSideOffset!=0xFFFFFFFF && pSheet->bSideOffset!=0xFFFFFFFF) 这个判断语句有问题导致执行了pBSideBuffer=NULL 么?
schlafenhamster 2012-07-27
  • 打赏
  • 举报
回复
pBSideBuffer=new char[0x200000];
pBSideBuffer=NULL???
boylovesports 2012-07-27
  • 打赏
  • 举报
回复
pBSideBuffer=new char[0x200000]; //分配存储空间
boylovesports 2012-07-27
  • 打赏
  • 举报
回复
内存块的读写属性如何查看呢?不是很明白,

BOOL CHpx301FView::GetClipName(int formID, CString filePath)
{
// SHEET_STRUCT mCardInfoBuf;
CStringArray mFieldArray;
CLIP_IN_DATA* pClip;

CFile mFile;
if(!mFile.Open(filePath,CFile::modeRead,NULL)) //打开filePath路径下的格式文件
return FALSE;
int mLen=mFile.GetLength();
if(mLen<1024)
return FALSE;
char* tempBuf=new char[mLen];
if(!tempBuf)
return FALSE;
mFile.ReadHuge(tempBuf,mLen); //读取格式文件到tempBuf中
mFile.Close();

////////////////////////////////////////////////////////////////
//是CRC校验么???
unsigned char* pCRC=(unsigned char*)tempBuf;
for(int xi=0; xi<320; xi++)
{
unsigned char xMask=xi&0xFF;
xMask>>=xi%8+1;
pCRC[xi]^=xMask;
}

////////////////////////////////////////////////////////////////

SHEET_STRUCT* pSheet=(SHEET_STRUCT*)tempBuf; //pSheet指向读取到tempbuf中的格式文件
pSheet->DeviceName[31]=0;
pSheet->CompnyName[31]=0;

//--2007.11.28-----------------------------------------------------------------------
// mCardInfoBuf=*pSheet; //你在这里起什么作用呢?
//strcpy(mCardInfoBuf.theSchemeFileName,filePath);
//-------------------------------------------------------------------------

CString s,s1;

s=pSheet->CompnyName;
s1=pSheet->DeviceName;
// s+=s1;
// s.Replace(" ","");
// AfxMessageBox(s,MB_OK,NULL);
// if(s!="HPX301")
// {
// delete tempBuf;
// AfxMessageBox("非法的 HPX 文件!",MB_OK,NULL);
// return FALSE;
// }
//
// s=pSheet->Version;
// AfxMessageBox(s,MB_OK,NULL);
// float tmpVersion=atof(s);
// if(tmpVersion<6.02f)
// {
// delete tempBuf;
// AfxMessageBox("非法的 HPX 文件版本!",MB_OK,NULL);
// return FALSE;
// }

pFSideBuffer=NULL; // char* pFSideBuffer;
char* tmpSidePtr=GetSideAdr(tempBuf,0); //指向正面格式文件的指针
if(!pFSideBuffer && tmpSidePtr) //正面格式文件存在且未分配内存空间
{
pFSideBuffer=new char[0x200000]; //分配存储空间
memset(pFSideBuffer,0xFF,256); //memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
}
else if(!tmpSidePtr && pFSideBuffer) //正面格式文件不存在且已分配正面存储空间
{
delete pFSideBuffer; //删除该内存空间
pFSideBuffer=NULL;
}
tmpSidePtr=GetSideAdr(tempBuf,1); //指向反面格式文件的地址
pBSideBuffer=NULL;
if(!pBSideBuffer && tmpSidePtr) //反面格式文件存在且未分配内存空间
{
pBSideBuffer=new char[0x200000]; //分配存储空间
memset(pBSideBuffer,0xFF,256); //清零
}
else if(!tmpSidePtr && pBSideBuffer) //反面格式文件不存在且已分配正面存储空间
{
delete pBSideBuffer;
pBSideBuffer=NULL;
}

if(pSheet->fSideOffset!=0xFFFFFFFF && pSheet->bSideOffset!=0xFFFFFFFF) //正反两面格式文件都存在
{
lFSideLength=pSheet->bSideOffset-pSheet->fSideOffset; //正面格式文件长度
memcpy(pFSideBuffer,tempBuf+pSheet->fSideOffset,pSheet->bSideOffset-pSheet->fSideOffset); //将正面格式文件拷贝到pFSideBuffer中
lBSideLength=mLen-pSheet->bSideOffset; //反面格式文件长度
//问题区域 ???、
memcpy(pBSideBuffer,tempBuf+pSheet->bSideOffset,mLen-pSheet->bSideOffset); //将反面格式文件拷贝到pBSideBuffer中
pTheBuffer=pFSideBuffer; //指向存储正面格式文件的pFSideBuffer
}
else if(pSheet->fSideOffset!=0xFFFFFFFF) //只有正面格式文件
{
lFSideLength=mLen-pSheet->fSideOffset; //正面格式文件长度
lBSideLength=0;
memcpy(pFSideBuffer,tempBuf+pSheet->fSideOffset,mLen-pSheet->fSideOffset); //将正面格式文件拷贝到pFSideBuffer中
}
else //正面格式文件不存在
{
delete tempBuf; //
return FALSE;
}

ClipCount[formID]=0; //用来统计卡formID中的切图数
if(tempBuf)
delete tempBuf;
/////////////////////////////////////////////////////////////////////////////////
mFieldArray.RemoveAll(); //清空mFieldArray
////////////////////////////////////////////////////////////////////////////////////
CLIP_DEFINITION tClip;
pClip = GetImageClip(pFSideBuffer); //获取正面剪切区切图信息
ClipCount[formID]=pClip->NumberOfClips; //正面缓冲区中的切图数量

CString clipTails[5]={"dat","bmp","jpg","tif","ocr"};

for(int i=0;i<ClipCount[formID];i++)
{
tClip=pClip->cdClips[i]; //指向正面缓冲区中的第i个切图信息
ClipArray[formID][i]=tClip.ClipName; //存储正面文件第i个切图的名称
// if(tClip.nFileFormat>=1 && tClip.nFileFormat<=5) //判断切图的存储格式
// FileType[formID][i]=clipTails[tClip.nFileFormat]; ///保存第i个切图的存储格式到FileType[formID][i]中

SideType[formID][i]="1"; //保存该图片的页面标识为正面
if(tClip.nFileFormat>1 && tClip.nFileFormat<=5)
FileType[formID][i]="."+clipTails[tClip.nFileFormat]; ///保存第i个切图的存储格式到FileType[formID][i]中
}
// int i = ClipCount[formID]; ///正面缓冲区中的切图数量 难道还在i的工作区么?
if(pBSideBuffer) //背面格式文件存在
{
pClip = GetImageClip(pBSideBuffer); ////获取背面剪切区切图信息
int iTmp=pClip->NumberOfClips; //反面缓冲区中的切图数量
for(int j=0;j<iTmp;j++)
{
tClip=pClip->cdClips[j]; //tClip指向反面缓冲区中的第j个切图信息
ClipArray[formID][i]=tClip.ClipName; //存储反面文件第j个切图的名称, 即数组中第i个,

SideType[formID][i]="2"; //保存该图片的页面标识为反面

if(tClip.nFileFormat>1 && tClip.nFileFormat<=5)
FileType[formID][i]="."+clipTails[tClip.nFileFormat]; ///保存第j个切图的存储格式到FileType[formID][i]中,
i++; //指向下一个切图
}
ClipCount[formID]+=iTmp; //ClipCount[formID] 用来存储formID中的所有切图数
}
if(pBSideBuffer) //清除缓存pBSideBuffer
delete pBSideBuffer;
if(pFSideBuffer)
delete pFSideBuffer; //清除缓存pFSideBuffer

pFSideBuffer=NULL;
pBSideBuffer=NULL;
return TRUE;

}
这个是完整的函数
schlafenhamster 2012-07-27
  • 打赏
  • 举报
回复
断点是设在memcpy(pBSideBuffer,tempBuf+pSheet->bSideOffset,mLen-pSheet->bSideOffset);处的,
1.pBSideBuffer是不是足够大?
2.tempBuf+pSheet->bSideOffset是不是在tempBuf内?
3.mLen-pSheet->bSideOffset是不是准确?
dahaiI0 2012-07-27
  • 打赏
  • 举报
回复
还要看指针所指向的内存块的读写属性,如果是只读的,也是会出错的。
boylovesports 2012-07-27
  • 打赏
  • 举报
回复
断点是设在memcpy(pBSideBuffer,tempBuf+pSheet->bSideOffset,mLen-pSheet->bSideOffset);处的,参数也没问题啊,
schlafenhamster 2012-07-27
  • 打赏
  • 举报
回复
断点在:
memcpy(pBSideBuffer,tempBuf+pSheet->bSideOffset,mLen-pSheet->bSideOffset);
查查各个参数是不是对。
boylovesports 2012-07-27
  • 打赏
  • 举报
回复
点击,找到memcpy.asm 后,仍然报错“Unhandled exception in Hpx301F.exe(MSVCRTD.DLL):0xC0000005: Access Violation."。悲催的!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧