zoukankan      html  css  js  c++  java
  • 函数返回值总结

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

    但愿人长久 千里共婵娟
  • 相关阅读:
    以正确的方式开源 Python 项目
    一个备胎的自我修养
    关于我们 | 读书马上
    基于libevent, libuv和android Looper不断演进socket编程
    libuv 与 libev 的对比
    OCaml Language Sucks
    Practical Common Lisp
    learning
    WebApi系列~QQ互联的引入(QConnectSDK)
    知方可补不足~用xsl来修饰xml
  • 原文地址:https://www.cnblogs.com/hellcats/p/5011408.html
Copyright © 2011-2022 走看看