全部博文(54)
分类: WINDOWS
2010-10-06 10:38:45
微软的VC对内存的初始化是有一定的规则的,那些认为编译器会自动把变量初始化为零的想法是天真且又错误滴。会引起巨大的悲伤的后果。(别的编译器有自己的规定,有的是随机的,有的是别的···Linux平台上,变量的默认初始值一般都是0)
栈中的变量是用 0xCC 初始化,之所以用这个来初始化,是因为这个0XCC是INT3中断(栈是受操作系统控制的,如遇非法的语句跳至此处执行,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啦。
这些东西谈不上什么新奇,但在调试的时候和反编译以及破解时比较有用,所以写下来为记。