关于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


 当前函数执行完成时,相关的临时变量和参数都被清除了。不能把指向这些临时变量的指针返回给调用者,这样的指针指向的数据是随机的

会给程式造成不可预料的后果。但是指针却有所不同,指针的地址在栈上,但是它所指向的内容却是在堆上面,所以并没有被清除。


 
 
 
发布了26 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Teemo_king/article/details/77098164