一个奇怪的C语言问题,涉及到指针、数组、堆栈、以及printf。下面实现:
整数向字符串的转换,返回字符串指针,并在main函数中调用printf显示。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* swich(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);
char b[10];
strcpy(b,p);
int i=0;
printf("%s,",b);
}
上面程序执行结果如下:
在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函数,把栈顶空间内容修改了。虽然保存了地址,但是原来的内容已经修改了,所以得不到结果。
来源: <http://zhidao.baidu.com/question/326625441.html>
时间: 2024-10-02 20:12:45