(转)奇怪的Stack around the variable was corrupted现象解析 以及 sprintf 的奇怪现象?

Code:
  1. 缘由:我在用sprintf时,把一个unsigned char的值以%02X形式付给一个 char[2]类型的数组或者指针时,系统能够正常计算,但是 报错:Stack around the variable was corrupted, 网上查原因:   
  2. 几乎没有有用的信息,只有一个临时解决方法:   
  3. 【原文:把 project->配置属性->c/c++->代码生成->基本运行时检查 为 默认值 就不会报本异常。具体原因正在研究中。。。】   
  4. 此方法的确能够解决这个报错。但是,到底是什么原因呢??   
  5.   
  6. 我重新写了一个非常简单的赋值main:   
  7. int _tmain(int argc, _TCHAR* argv[])   
  8. {   
  9. char a[2];    
  10. sprintf(a,"%x",15);   
  11.   printf("%c /n",a[0]);     
  12.   printf("%s",a);   
  13. return 0;   
  14. }   
  15. 显示:   
  16. f   
  17. f   
  18.   
  19. 上面的代码是不会提示警告的,把15以16进制的形式写到a地址上面,其实就是a[0]='f'.所以两个printf都正确的执行,程序没有报错。   
  20.   
  21. 下面给a[1]赋值,我们知道,此时如果给a[1]赋值不为0,那么它以%s输出的时候,就没有截止符号,系统会输出一些乱七八糟的东西:   
  22. int _tmain(int argc, _TCHAR* argv[])   
  23. {   
  24. char a[2];    
  25.   
  26. sprintf(a,"%x",15);    
  27. a[1]='d';   
  28. printf("%c /n",a[0]);   
  29. printf("%c /n",a[1]);   
  30. printf("%s",a);    
  31. return 0;   
  32. }   
  33. 显示:   
  34. f   
  35. d   
  36. fd烫烫烫眺'   
  37.   
  38. 尽管显示有问题,但是系统还是没有弹出什么警告!   
  39.   
  40. 可是,如果我们换一种方式来为a[1]赋值,   
  41. int _tmain(int argc, _TCHAR* argv[])   
  42. {   
  43. char a[2];    
  44. sprintf(a,"%x",15);    
  45. sprintf(a+1,"%x",14);   
  46.   
  47. printf("%c /n",a[0]);   
  48. printf("%c /n",a[1]);   
  49. printf("%s",a);    
  50. return 0;   
  51. }   
  52. 系统就会出错::   
  53.   
  54. 不过printf倒是正常的执行了,这是什么原因??     
  55.   
  56. 前面对a[1]的直接复制和这里的赋值有什么本质区别,为什么会报这个错误??   
  57.   
  58. 后来经过测试,如果把数组a的范围再扩大一点,改为a[3],即:   
  59. int _tmain(int argc, _TCHAR* argv[])   
  60. {   
  61. char a[3];    
  62.   
  63. sprintf(a,"%x",15);    
  64. //a[1]='d';   
  65. sprintf(a+1,"%x",14);   
  66. printf("%c /n",a[0]);   
  67. printf("%c /n",a[1]);   
  68. printf("%s",a);    
  69. return 0;   
  70. }   
  71.   
  72. 系统,就会正常的执行并且不会弹出 错误窗口。   
  73.   
  74.   
  75. 原因何在?? 和 sprintf有什么关系没?? 而且大家如果google一下,这个问题很普遍,一般都是按开头我说的,调整vs的配置,但是它之所以出现,就如上面我给出的几个示例一样,肯定是在特定场合下出现的,why?   
  76.   

我也遇到了这样的问题。究竟是怎么才会出现这样的错误?看了文章后,只懂了一半。

文章出处:http://topic.csdn.net/u/20100620/23/610038d6-95a3-4901-903c-2a9d7fb25bee.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值