關於sting臨時地址返回問題

最近學到關於指針和字符串的轉換,遇到一些返回臨時變量地址的問題,記錄並分享一下。下面爲不使用臨時變量的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;
}
由此聯想到幾個問題:

  1. 關於strcpy函數,爲何沒有地址返回的值沒有被清除或修改;
  2. puts函數與printf函數,調用過程有何不同;

下面附一個關於部分問題的解釋:
來自網絡:http://blog.csdn.net/bigloomy/article/details/6562105


 當前函數執行完成時,相關的臨時變量和參數都被清除了。不能把指向這些臨時變量的指針返回給調用者,這樣的指針指向的數據是隨機的

會給程式造成不可預料的後果。但是指針卻有所不同,指針的地址在棧上,但是它所指向的內容卻是在堆上面,所以並沒有被清除。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章