最近學到關於指針和字符串的轉換,遇到一些返回臨時變量地址的問題,記錄並分享一下。下面爲不使用臨時變量的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
當前函數執行完成時,相關的臨時變量和參數都被清除了。不能把指向這些臨時變量的指針返回給調用者,這樣的指針指向的數據是隨機的
會給程式造成不可預料的後果。但是指針卻有所不同,指針的地址在棧上,但是它所指向的內容卻是在堆上面,所以並沒有被清除。