C语言函数返回值的实现方法和误区

实例:你们认为这三个函数能正常返回吗? 

int func1(int a , int b)
{
	int c = 0;
	c = a + b;
	return c;
}

char * func2()
{
	char *strTmp = "abs";
	return strTmp;
}
char *func3()
{
	char buf[] = "qwe";
	return buf;
}

int main()
{
	int rec = 0;
	int x = 1;
	int y = 2;
	rec = func1( x , y );
	printf("rec = %d\n" , rec);
	char *str;
	str = func2();
	printf("%s\n" , str);
	str = func3();
	printf("str = %s\n" , str);
	return 0;
}

 func1和func2一定是可以返回的,func3不能返回,为什么呢?

先来理解一下函数返回值的原理func1的实现流程,main函数变量x,y复制到函数func1的栈上a,b。此时,定义了一个局部变量c,把a+b的值赋值给c,return c的时候会把局部变量c的值赋值到一个系统自动生成和管理的临时变量c`上,并把局部变量c的值销毁,rec=func1(x,y);时,rec=临时变量c`的值。所以可以正常返回。

那么同理对比func2和func3,有什么区别?

区别在于char *str= "abs";“abs”字符串保存在程序的常量存储区,str指向这个变量,当函数返回的时候,strTmp的临时变量里保存的是“abs”的地址,,而“abs”的地址里是常量存储区,所以可以正常返回。

而char str[] = "qwe";"qwe"虽然存储在常量存储区,但str只是一个副本,所以函数返回时这个副本的内容被销毁了,而return的buf的临时变量就是这个副本的地址,里边的东西已经被干掉了,所以不能正常返回。

 

你可能感兴趣的:(C语言基础误区)