请教一个关于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下就不会出现上述问题,请各位帮忙!!!谢谢
...全文
232 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));
2022 / 01/ 30: 新版esptool 刷micropython固件指令不是 esptool.py cmd... 而是 esptool cmd... 即可;另外rshell 在 >= python 3.10 的时候出错解决方法可以查看:  已于2022年发布的: 第二章:修复rshell在python3.10出错 免费内容: https://edu.csdn.net/course/detail/29666 micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机玩物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。为记录单片机传输过来的数据, 本教程会教大家入门数据库。  本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 本教程micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。  学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)  

64,646

社区成员

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

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