Chinaunix首页 | 论坛 | 博客
  • 博客访问: 312898
  • 博文数量: 54
  • 博客积分: 3050
  • 博客等级: 中校
  • 技术积分: 601
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-25 16:53
文章分类
文章存档

2012年(1)

2011年(7)

2010年(46)

我的朋友

分类: WINDOWS

2010-10-06 10:38:45


今天找东西偶然发现的~

以下转载原文:

—————————————ZZ -start ————————————

微软的VC对内存的初始化是有一定的规则的,那些认为编译器会自动把变量初始化为零的想法是天真且又错误滴。会引起巨大的悲伤的后果。(别的编译器有自己的规定,有的是随机的,有的是别的···Linux平台上,变量的默认初始值一般都是0)

栈中的变量是用 0xCC 初始化,之所以用这个来初始化,是因为这个0XCCINT3中断(栈是受操作系统控制的,如遇非法的语句跳至此处执行,0xCC是汇编语句中的(int 3)的二进制代码,因此程序就会中断进入调试状态,防止出现不可预知的错误。)。堆中分配的内存(即动态分配的内存,例如 new )用0xCD ( Cleared Data ) 来初始化,而其释放后(如delete)则内存中标记为0xDD ( Dead Data ) ,这个你可以自己在VC中进行验证,我是用VC6进行测试的,符合上述规定。

0xFD( deFencde Data ) 初始化受保护的内存(debug 版在动态分配内存的前后加入保护内存以防止越界访问),其中括号中的词是微软建议的助记词。这样做的好处是这些值都很大,作为指针是不可能的(而且 32 位系统中指针很少是奇数值,在有些系统中奇数的指针会产生运行时错误),作为数值也很少遇到,而且这些值也很容易辨认,因此这很有利于在 Debug 版中发现 Release 版才会遇到的错误。

静态变量及全局变量自动初化为0(有的编译器把NULL定义成0,但请注意:不是所有的NULL都是0,而且一定要区分不同语言,不同环境,不同编译器,数据库中,NULL均有特殊的意义)。

 所以在C\c++编程里最好在定义后立刻手动初始化,指针给个NULL或者0,数组一律给个0,一切就OK啦。

这些东西谈不上什么新奇,但在调试的时候和反编译以及破解时比较有用,所以写下来为记。

——————————————ZZ -end ————————————

PS:Visual stdio 和 Visual C++应该是一样的。
PSS: 这个空间不错,楼主貌似是功力深厚兴趣广泛,关于Android、Java、虚拟机都有很深入的东西。

阅读(1348) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~