首先,这个问题有点2,下面我开始了。
一个2一点的程序:
#include <stdio.h>
char *f()
{
char arr[]="hello";
return arr;
}
void main()
{
char *p;
p=f();
printf("%s\n",p);
}
我们知道,这个程序打印出来的是乱码,因为那个函数f中的arr数组的空间是分配在栈中的,当函数调用结束时,系统自动回收内存。
但是,这个但是很重要,我们知道,所谓的回收就是把栈顶指针改变,但是栈中的内容不会变,所以如果把打印语句改成
printf("%c\n",*p);
我们就会打印出一个'h',同样,在打印语句中加上
p++;
这条语句,就会打印出'e',如果是p+=2,就会打印出'l'。。。以此类推。
高潮来了:
如果我的main函数是这样的:
void main()
{
char *p;
p=f();
printf("%c\n",*p);
p++;
printf("%c\n",*p);
p++;
printf("%c\n",*p);
p++;
printf("%c\n",*p);
p++;
printf("%c\n",*p);
}
我是想打印hello出来的,可是只有一个h打出来了,后面的是乱码。
我把第一个printf语句删掉后,就会把e打印出来,后面还是乱码。
如果我一次性删两个printf,就会把l打印出来,后面是乱码。
。。。。。。
请问第一个printf语句肿么了,以至于排在后面的printf语句都打印出了乱码,伤不起啊~~~~~。希望高手解救我
请详细解释一下,谢谢啦
追答执行printf时,首先会把*p的值算出来,这时候堆栈没有破坏,所以第一次可以打印
一旦执行了printf,printf使用到了回收的堆栈,所以后面的内容都被破坏了,后面都是乱码
额,我还是没太懂,就是printf在哪一步使堆栈被破坏。请说的稍微详细一些,我对C语言的了解还不是很深刻。最好能从底部的内存变换上一步一步分析一下,谢谢。
追答调用函数printf前先要将形参压栈,这时候要计算*p,这时候原堆栈没被破坏,所以可以得到正确的值,就是说传给第一个printf的参数值是对的,但堆栈会被破坏,所以后面的就无法打印出来了。
追问我想知道他破坏堆栈的细节,可不可以告诉我T_T~~,谢谢啦
追答首先形参压栈,就会破坏堆栈,然后printf再分配变量,都会破坏