程序中出现“烫烫烫烫烫烫烫.......”和“屯屯屯屯屯屯......”的原因

        在刚开始写程序的时候,经常会发生产生莫名的执行结果,最常见的就是在程序中输出“烫烫烫.....”或者“屯屯屯......”,以前不理解为什么,后来学了汇编以后才弄清楚。

        以下面这段简单的代码为例进行说明:

1 #include <stdio.h>
2 int sum(int a, int b)
3 {
4 	return a + b;
5 }
6 int main(void)
7 {
8 	int a;
9	printf("%s\n", (char*)&a);
10	sum(1, 2);
11
12	return 0;
13 }

        我们在第8行和第9行加一个断点,来看看它的反汇编代码:


            从上面的汇编代码中,我们可以看到在开辟函数栈帧以后,对这个栈帧进行了初始化(上图中框起来的部分),初始化的值为0xCCCCCCCC,而“烫”字对应的十六进制正好是0xCCCC(一个汉字占两个字节),所以当使用了一个未初始化的局部变量时,它的初始值就是0xCCCCCCCC,如果对它进行以字符串的形式输出就会输出“烫烫烫......”。

        以前在使用VC++6.0时,还会出现“屯屯屯......”的情况,这个原因和上面本质是一样的,只不过这个编译器进行函数栈帧的初始化时使用的值是“0xCDCDCDCD”,而“屯”字则对应十六进制为“0xCDCD”.


        最后贴一下上面代码运行的结果:


           

猜你喜欢

转载自blog.csdn.net/kang___xi/article/details/80465939