#include<stdio.h>#include<stdlib.h>#include<string.h>char* switch(int n){char A[20],B[20];char*p;//=(char*)malloc(4*sizeof(char));int i=0,a;int minus=0;if(n<0){minus=1;n=-n;}while(n/10!=0){a=n%10;n=n/10;A[i++]='0'+a;}a=n%10;A[i++]='0'+a;if(minus==1)A[i++]='-';A[i]=0;int len=i;int j=len-1;i=0;while(i<len){B[i]=A[len-1-i];i++;}B[i]=0;p=B;printf("%s,",p);return p;}void main(){int a=-234;char* p=swich(a);printf("%s,",p);}
上面程序运行结果例如以下:
在swich函数中,234能正常输出。
而在main中输出的却是乱码,假设在main中用
for(int i=0;i<3;i++){printf("%c",p[i]);}
则仅仅有'2'能正确输出,p[1],p[2]乱码。
这是什么原因呢?
调用函数printf前先要将形參压栈,这时候要计算*p。
所以,第一条printf语句已经把參数算出来并放到栈顶保存了。然后调用printf函数(函数调用须要用到栈建立訪问连和控制链,而原来的函数f运行完了,原本f是在栈顶的,所以。函数f的栈空间释放。数组空间也被释放)。printf占用了栈,所以,把原来函数f的栈空间内容改动了。所以,第一条printf语句是能够得到结果的。
后面由于arr空间的内容已经被改动。所以,之后的printf语句都得不到结果。
顺便再解释一下printf("%s\n",p);得到的为什么是乱码。
正如上面所说,先计算參数p的值保存栈顶。
保存的值为arr的地址。然后调用printf函数,把栈顶空间内容改动了。尽管保存了地址,可是原来的内容已经改动了,所以得不到结果。
浙公网安备 33010602011771号