奇怪的Stack around the variable was corrupted现象解析 以及 sprintf 的奇怪现象?谁能解释?

jo_say 2010-06-20 11:50:01
奇怪的Stack around the variable was corrupted现象解析 以及 sprintf 的奇怪现象?谁能解释?

缘由:我在用sprintf时,把一个unsigned char的值以%02X形式付给一个 char[2]类型的数组或者指针时,系统能够正常计算,但是 报错:Stack around the variable was corrupted, 网上查原因:
几乎没有有用的信息,只有一个临时解决方法:
【原文:把 project->配置属性->c/c++->代码生成->基本运行时检查 为 默认值 就不会报本异常。具体原因正在研究中。。。】
此方法的确能够解决这个报错。但是,到底是什么原因呢??

我重新写了一个非常简单的赋值main:
int _tmain(int argc, _TCHAR* argv[])
{
char a[2];
sprintf(a,"%x",15);
printf("%c \n",a[0]);
printf("%s",a);
return 0;
}
显示:
f
f

上面的代码是不会提示警告的,把15以16进制的形式写到a地址上面,其实就是a[0]='f'.所以两个printf都正确的执行,程序没有报错。

下面给a[1]赋值,我们知道,此时如果给a[1]赋值不为0,那么它以%s输出的时候,就没有截止符号,系统会输出一些乱七八糟的东西:
int _tmain(int argc, _TCHAR* argv[])
{
char a[2];

sprintf(a,"%x",15);
a[1]='d';
printf("%c \n",a[0]);
printf("%c \n",a[1]);
printf("%s",a);
return 0;
}
显示:
f
d
fd烫烫烫眺'

尽管显示有问题,但是系统还是没有弹出什么警告!

可是,如果我们换一种方式来为a[1]赋值,
int _tmain(int argc, _TCHAR* argv[])
{
char a[2];
sprintf(a,"%x",15);
sprintf(a+1,"%x",14);

printf("%c \n",a[0]);
printf("%c \n",a[1]);
printf("%s",a);
return 0;
}
系统就会出错::

不过printf倒是正常的执行了,这是什么原因??

前面对a[1]的直接复制和这里的赋值有什么本质区别,为什么会报这个错误??

后来经过测试,如果把数组a的范围再扩大一点,改为a[3],即:
int _tmain(int argc, _TCHAR* argv[])
{
char a[3];

sprintf(a,"%x",15);
//a[1]='d';
sprintf(a+1,"%x",14);
printf("%c \n",a[0]);
printf("%c \n",a[1]);
printf("%s",a);
return 0;
}

系统,就会正常的执行并且不会弹出 错误窗口。


原因何在?? 和 sprintf有什么关系没?? 而且大家如果google一下,这个问题很普遍,一般都是按开头我说的,调整vs的配置,但是它之所以出现,就如上面我给出的几个示例一样,肯定是在特定场合下出现的,why?



...全文
46836 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wolflyecn 2011-09-23
其实就是C字符串最后的结束符'\0'有没有的问题。我也遇到过。
回复
影影 2011-04-25
阿弟 越界了 小心使用局部变量
回复
sada09 2010-11-08
http://topic.csdn.net/u/20100620/23/610038d6-95a3-4901-903c-2a9d7fb25bee.html
回复
sada09 2010-11-08
感谢楼主解决问题
回复
kimjin1988 2010-10-06
我也遇到了这个问题~~
回复
wan353694124 2010-09-14
我也遇到了这个问题,添加一个越界检测的函数,问题就解决了啊,仔细看看自己的程序发现确实是越界的问题啊!
回复
jo_say 2010-07-31
是越界。[Quote=引用 11 楼 vtkspider 的回复:]
也碰到这个问题,不是越界啊
[/Quote]
回复
vtkspider 2010-07-26
也碰到这个问题,不是越界啊
回复
jo_say 2010-06-21
如果你方便 看看我另外一个帖子的问题 那个也是一个很莫名奇怪的事情: [thx]

http://topic.csdn.net/u/20100617/19/2d6d550c-1f19-42d5-8029-bdb688adf47a.html

[Quote=引用 6 楼 arong1234 的回复:]
这和sprintf没有关系,完全是你内存访问越界导致得。你打印一个%02X,需要得空间至少得3个字节,你给2个怎么购。

内存访问越界导致得错误得现象是千变万化得
看看
http://blog.vckbase.com/arong/archive/2009/12/30/40598.html
[/Quote]
回复
liutengfeigo 2010-06-21

睡觉去。。。最后一周,坚持不逃课。
回复
jo_say 2010-06-21
thx 看来是没搞清这个地方 我再看看 [Quote=引用 3 楼 mstlq 的回复:]
sprintf,格式描述为"%02X"
那么buffer的长度应该为3(请不要忘记了'\0'),unsigned char[2]是不够的,会造成越界访问
说完
不做进一步解释了
[/Quote]
回复
arong1234 2010-06-21
这和sprintf没有关系,完全是你内存访问越界导致得。你打印一个%02X,需要得空间至少得3个字节,你给2个怎么购。

内存访问越界导致得错误得现象是千变万化得
看看
http://blog.vckbase.com/arong/archive/2009/12/30/40598.html
回复
jo_say 2010-06-21
有么 呵呵 我还没见过几个人用 [Quote=引用 1 楼 lthyxy 的回复:]
这个头像怎么这么火。。。
[/Quote]
回复
mstlq 2010-06-21
sprintf,格式描述为"%02X"
那么被写入buffer的数据长度应该为3(请不要忘记了'\0'),unsigned char[2]是不够的,会造成越界访问
说完
不做进一步解释了
回复
jo_say 2010-06-21
刚才的图像没显示清楚:
回复
liutengfeigo 2010-06-20

这个头像怎么这么火。。。
回复
相关推荐
发帖
C++ 语言
创建于2007-09-28

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2010-06-20 11:50
社区公告
暂无公告