• 函数返回值总结


     #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函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。

    但愿人长久 千里共婵娟
  • 相关阅读:
    mysql 提权总结
    CTF线下赛AWD套路小结
    url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介
    url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介
    使用httpclient必须知道的参数设置及代码写法、存在的风险
    使用httpclient必须知道的参数设置及代码写法、存在的风险
    HttpClient学习笔记
    HttpClient学习笔记
    HttpClient系统日志配置
    HttpClient系统日志配置
  • 原文地址:https://www.cnblogs.com/hellcats/p/5011408.html
Copyright © 2020-2023  润新知