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的内存已经被改变了,操作它时导致内存错误。
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的内存已经被改变了,操作它时导致内存错误。
相关文章推荐
- 修改程序堆栈的可执行属性
- [Hb-XVII] 计算机的抽象层次-简 使用寄存器 使用内存空间 程序执行过程 使用main函数规定 不定参数函数机制 C
- ora-12154 tns 无法处理服务名(执行的程序途径不一致导致,枚举网络数种方法,大家还有其他解决办法?)
- 在printf()函数中修改变量值可能导致结果出错
- 将第十四周的阅读程序中的Vehicle类的定义修改为纯虚函数,找出main()函数中将使编译出错的行删除
- Web报表导出与“.rpt 内出错:拒绝访问报表文件。其他程序可能正在使用它”之我解
- linux c 时间函数,获取程序执行时间
- Linux调用backtrack函数打印程序崩溃时的调用堆栈
- 在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接
- linux下执行strlwr函数出错:ld returned 1 exit status
- 任务执行函数return后程序会去往何方
- 该页无法显示 您试图从目录中执行 CGI、ISAPI 或其他可执行程序,但该目录不允许执行程序。 解决方法
- 弹错:正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码
- 实现执行外部程序,并等待程序结束的函数。
- 用其他身份执行程序
- 如何为WPF添加Main()函数 程序入口点的修改
- LDD3 short程序编译出错之修改
- 您试图从目录中执行 CGI、ISAPI 或其他可执行程序
- Java程序执行Linux命令(JSP运行其他程序)
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起