函数返回值总结

 #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\n",i,*p);
     char *str,*str1; 
     str=returnStr();
   str1=returnStrshuzu(); printf(
"%s\n", str); printf("%d,%d",i,*p);
printf("%s\n",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函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。

 

posted @ 2015-12-01 21:45  Lucky-小王子  阅读(400)  评论(0编辑  收藏  举报