(转)奇怪的Stack around the variable was corrupted现象解析 以及 sprintf 的奇怪现象?
2010-09-04 23:53
357 查看
Code:
缘由:我在用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?
我也遇到了这样的问题。究竟是怎么才会出现这样的错误?看了文章后,只懂了一半。
文章出处:http://topic.csdn.net/u/20100620/23/610038d6-95a3-4901-903c-2a9d7fb25bee.html
缘由:我在用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?
我也遇到了这样的问题。究竟是怎么才会出现这样的错误?看了文章后,只懂了一半。
文章出处:http://topic.csdn.net/u/20100620/23/610038d6-95a3-4901-903c-2a9d7fb25bee.html
相关文章推荐
- 记一次函数崩溃的现象分析,stack around the variable…was corrupted
- Run-Time Check Failure #2 - Stack around the variable 'chCommand' was corrupted.
- Run-Time Check Failure #2 - Stack around the variable 'myTrackbarName' was corrupted.
- vs2010编译没有问题,然而运行出错Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.
- Run-Time Check Failure #2 - Stack around the variable 'var' was corrupted
- C/C++文件读取报错:stack around the variable 'x' was corrupted.
- 解决:stack around the variable was corrupted
- stack around the variable "xxx"was corrupted.
- VS2008中Run-Time Check Failure #2 - Stack around the variable 'xxx' was corrupted 错误解决方法
- Opencv中调用FileStorage出现错误“Stack around the variable '*' was corrupted.”
- Stack around the variable was corrupted 解决方案 ---增大栈空间
- Run-Time Check Failure #2 - Stack around the variable 'xxx' was corrupted(待解决)
- C语言 在VS环境下一个很有意思的报错:stack around the variable was corrupted
- 错误:stack around the variable * was corrupted
- Run-Time Check Failure #2 - Stack around the variable 'cz' was corrupted.
- 【Coding】Stack around the variable was corrupted 解决方案
- VS2008中Run-Time Check Failure#2 - Stack around the variable * was corrupted
- Run-Time Check Failure #2 - Stack around the variable 'var' was corrupted
- Run-Time Check Failure #2 - Stack around the variable 'var' was corrupted
- vs2005 c++ Stack around the variable was corrupted