#include<iostream> using namespace std; int max(int a, int b) { if(a > b) return a; return b; } int *returnshuzu() { int b[5]={1}; return b;//返回地址,潜在风险!!! }
char *returnStrshuzu()
{
char p[]="hello girl!";
char *p1=p;
return p1;
}
char *returnStr() { char *p="hello world!"; return p; } int main(void) { int i=0; i=max(1,3);//可以 int *p = returnshuzu(); printf("%d,%d ",i,*p); char *str,*str1; str=returnStr();
str1=returnStrshuzu(); printf("%s ", str); printf("%d,%d",i,*p);
printf("%s ",str1); system("pause"); return 0; }
函数返回值分为两类:一个是返回值,一个是返回地址
1.当返回地址时,不存在风险。int max(int a, int b)函数,函数传参时,a,b为拷贝,把最大值返回后,a,b销毁,但值已经成功被返回。
2.返回地址时,要注意。尤其是数组时,如int *returnshuzu(),前后两个语句打印的值不一样,原因是函数返回的是局部变量的指针,该局部变量存放在栈中,当returnStr函数退出时,栈要清空,局部变量的内存 也被清空了,所以这时的函数返回的是一个已被释放的内存地址,所以打印出来的是乱码。 (系统可能没及时回收局部变量才导致打印出的还是局部变量的值)
int *returnStrshuzu()函数了把一个局部变量(char []型数组)赋给char 型指针p1,该局部变量存放在栈中,函数结束后,栈要清空。因此打印出来是乱码。
3.但是char *returnStr() 因为"hello world!"是一个字符串常量,存放在静态数据区,把该字符串常量存放的静态数据区的首地址赋值给了指针,所以returnStr函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。