您的位置:首页 > 其它

memcpy函数导致申请的其他堆栈空间被修改,执行程序出错

2010-12-02 10:03 337 查看
    昨天调一个小程序,调了很久,没有找出错误的原因。程序部分段如下:

  socketC = new SocketClient("127.0.0.1", 5005, 3);
  CString error;
  CString strSensorID;
  //strSensorID.Format(_T("%d,%d,%d,%d,%d,%d,%d,%d,%d"),1,2,3,4,5,6,7,8,9);
  DEV_PARA1 no;
  if(socketC->init()&&socketC->connect_server())
   if(socketC->getDevNo(no))
    strSensorID.Format(_T("%d,%d,%d,%d,%d,%d,%d,%d,%d"),1,2,3,4,5,6,7,8,9);//此处执行format出错。上面的注释行执行时不出错,最后面一行代码执行不出错

   else;
  else
   error.Format(_T("%S"), socketC->getLastError());
 
strSensorID.Format(_T("%d,%d,%d,%d,%d,%d,%d,%d,%d"),1,2,3,4,5,6,7,8,9);

 

    开始以为是vs编译器或者是内存的原因,重启vs及重新编译整个工程,结果还是出错。最后相同的代码放在不同的地方有不同的效果,推想应该是if语句里面的判断出了问题。查找getDevNo(no)的代码,发现里面有句mencpy(&no,content,sizeof(content)),content的长度为256,而no结构体的长度为16,执行memcpy时把no后面的256-16的内存单位也都改变了,而根据变量的申请空间可知,error及strSensorID的内存空间紧跟着no的空间,所以strSensorID的内存已经被改变了,操作它时导致内存错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编译器 server
相关文章推荐