最近学到关于指针和字符串的转换,遇到一些返回临时变量地址的问题,记录并分享一下。下面为不使用临时变量的int转string的代码。
/*
不能使用临时变量
*/
char* Myitoa(char *str,int n)
{
int m=n;
int l=n;
int i=1;
int k=0;
//char *p=str;//vital;
while(l/=10)
{
i*=10;
}
while(m>0)
{
n/=i;
m%=i;
i/=10;
*str++='0'+ n;//转成字符
n=m;
str++;
}
*str = '\0';
return str;
}
经过总结,出错部分的代码改写为
char* s1()
{
return "123";
}
char* s2()
{
char c[5]="9911";
return c;
}
int main()
{
char str[10]={};
strcpy(str,s2());
//出现警告,'strcpy': This function or variable may be unsafe.
printf("%s\n",str);//结果为9911
puts(str);//结果为9911
printf("%s,\n",s1());//结果为123
printf("%s,\n",s2());//结果为123
puts(s1());//结果为乱码
puts(s2());//结果为乱码
return 0;
}
由此联想到几个问题:
- 关于strcpy函数,为何没有地址返回的值没有被清除或修改;
- puts函数与printf函数,调用过程有何不同;
下面附一个关于部分问题的解释:
来自网络: http://blog.csdn.net/bigloomy/article/details/6562105
当前函数执行完成时,相关的临时变量和参数都被清除了。不能把指向这些临时变量的指针返回给调用者,这样的指针指向的数据是随机的
会给程式造成不可预料的后果。但是指针却有所不同,指针的地址在栈上,但是它所指向的内容却是在堆上面,所以并没有被清除。