请教一个关于Run-Time Check Failure #2的错误

rabbit729 2008-05-20 04:14:52
各位帮忙看看下面一段代码:
#include <iostream>
using namespace std;

void main()
{
char CPL[] = "01fd6ce36da24be5b3c7422260c2169b";
char CPLID[17];
memset(CPLID, 0, 17);

for (int i = 0; i < 16; i++)
{
sscanf(CPL + 2 * i, "%02x", CPLID + i);
}
}
编译可以通过,执行时提示:
Run-Time Check Failure #2-Stack around the variable 'CPLID'was corrupted.
可是我实在找不出CPLID那个地方用错了。谢谢!!!
另外上述代码在vs.net2003上会出现如上问题,可是在vc6.0下就不会出现上述问题,请各位帮忙!!!谢谢
...全文
231 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
flourish1 2008-06-13
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>

void main()
{
char CPL[] = "01fd6ce36da24be5b3c7422260c2169b";
char CPLID[19];
memset(CPLID, 0, 17);

for (int i = 0; i <16; i++)
{
sscanf(CPL + 2 * i, "%02x", CPLID + i);
}
}

核心提示:
(1)程序运行栈从高地址向低地址分配,而局部静态数组(如本例中的CPLID[19])从低地址向高地址分配;
(2)sscanf以%02x方式读入一个字节,但实际却要覆盖掉4个字节;例如当i=15时,不仅CPLID[15]的值会被更改为0x9b,而CPLID[16],CPLID[17]和CPLID[18]的值也会被更改(这里是被清零);而这三个位置可能正好保存了main函数正常返回(调用return 0)所需要的关键信息,所以出现运行栈被破坏的提示;
(3)这里采取预先多分配3个字节的方式解决这个问题;当然也可以通过备份的方式解决,即先将CPLID[16],CPLID[17]和CPLID[18]的值备份起来,在函数末尾再拷贝回去即可,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>

void main()
{
char CPL[] = "01fd6ce36da24be5b3c7422260c2169b";
char CPLID[16];
memset(CPLID, 0, 16);
char a=*(CPLID+16);
char b=*(CPLID+17);
char c=*(CPLID+18);

for (int i = 0; i <16; i++)
{
sscanf(CPL + 2 * i, "%02x", CPLID + i);
}
*(CPLID+16)=a;
*(CPLID+17)=b;
*(CPLID+18)=c;

}
rabbit729 2008-05-23
  • 打赏
  • 举报
回复
咳,一直没人来解决,没法结贴呀!
机智的呆呆 2008-05-21
  • 打赏
  • 举报
回复
循环8次吧?一次写两个~~~~~~·
rabbit729 2008-05-21
  • 打赏
  • 举报
回复
to:ouyh12345
sscanf(CPL + 2 * i, "%02x", &CPLID[i]);
这个方法不行
ouyh12345 2008-05-21
  • 打赏
  • 举报
回复
sscanf(CPL + 2 * i, "%02x", &CPLID[i]);
rabbit729 2008-05-21
  • 打赏
  • 举报
回复
to:iu_81:
Stack pointer corruption is caused writing outside the allocated buffer in stack memeory
我知道是这个原因,但我找不出来那个地方错了,还请详细指教


memset(CPLID, 0, 16);

这个方法我这边还是不行,谢谢了
iu_81 2008-05-20
  • 打赏
  • 举报
回复
memset(CPLID, 0, 16);
iu_81 2008-05-20
  • 打赏
  • 举报
回复
Stack pointer corruption is caused writing outside the allocated buffer in stack memeory
rabbit729 2008-05-20
  • 打赏
  • 举报
回复
不会吧!人气这么不旺!!自己顶一下!!!!!!
rabbit729 2008-05-20
  • 打赏
  • 举报
回复
楼上的,这样编译都通不过了
ouyh12345 2008-05-20
  • 打赏
  • 举报
回复
sscanf(CPL + 2 * i, "%02x", &(CPLID + i));

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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