关于vs2008中“烫烫烫...”或“屯屯屯...“的问题

来源:互联网 发布:c语言编程图形 编辑:程序博客网 时间:2024/05/09 21:33

联系方式:uestc001@gmail.com,欢迎转载,请注明出处http://blog.csdn.net/uestc001/article/details/8454760

今天写代码,出现了“屯屯屯屯”,说明我忘记初始化了。这个屯屯屯很好玩,开始编程那会儿经常遇到,菜鸟,所以很眼熟。

在vs2008里可能遇到“烫烫烫烫烫烫烫烫烫烫烫”或“屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯”。什么意思呢?

请看代码:

[cpp] view plaincopyprint?
  1. #include "stdafx.h"   
  2. #include <string.h>   
  3.   
  4. int _tmain(int argc, _TCHAR* argv[])  
  5. {  
  6.  unsigned char testArray[256];   
  7.  printf("%s\n", testArray);  
  8.   
  9.  unsigned char *p = new unsigned char[256];  
  10.  printf("%s\n", p);  
  11.  delete []p;  
  12.  p = NULL;  
  13.  return 0;  
  14. }   

效果:

"烫"的编码是0xCCCC, "屯"的编码是0xCDCD 

网上搜了一下,是这么解释的:

debug模式为了便于在出现问题的时候查找原因,编译器会对未手工初始化的数据填充特定的值。

在dbgheap.c中106-109行(VS2008)有如下代码段:

[cpp] view plaincopyprint?
  1. static unsigned char _bNoMansLandFill = 0xFD;   /* fill no-man's land with this */  
  2. static unsigned char _bAlignLandFill  = 0xED;   /* fill no-man's land for aligned routines */  
  3. static unsigned char _bDeadLandFill   = 0xDD;   /* fill free objects with this */  
  4. static unsigned char _bCleanLandFill  = 0xCD;   /* fill new objects with this */  
  5.   
  6. static _CrtMemBlockHeader * _pFirstBlock;  
  7. static _CrtMemBlockHeader * _pLastBlock;  

说明:

_bNoMansLandFill,byte No Mans Land Fill, "no-man's-land"的意思是:所有权争执未定的土地,这里表示边界内存。注释说了用这个值填充内存分配的边界。当你访问到这个值的时候,就说明访问越界了。

_bAlignLandFill,byte Align Land Fill, 内存对齐填充值。

_bDeadLandFill,byte Dead Land Fill,填充已经释放的内存空间,比如delete了一段内存空间,这段空间就填充0xDD,再次尝试delete的时候,就会crash了。

_bCleanLandFill,byte Clean Land Fill,堆区未手动初始化的填充值。

0xCC(244)是自动变量为初始化的填充值,栈区分配的时候就填充0xCC。

Vs2008的Debug用0xCD(255)填充,两个0xCD和在一起就是“屯”。

总结:出现“烫”或“屯”,解决办法:扩大数组范围或初始化数组 。

 

参考:http://hi.baidu.com/luosiyong/item/2020760be3629a823c42e208

(完)

 

此文章来自于【http://blog.csdn.net/uestc001/article/details/8454760】

原创粉丝点击