zoukankan      html  css  js  c++  java
  • C/C++返回局部变量

    原则:

    能否正常返回这个值,要看这个值的内容或指向的内容是否被回收,导致空指针或者真实内容被擦除。【一旦返回值有指针或者地址,就需要着重考虑,而返回一个值是一般都可以的,可参考C++的临时变量】

    下面对不同情况说明。

    1、返回指向常量的指针

    #include <stdio.h> 
    char *returnStr() 
    { 
        char *p="hello world!"; 
        return p; 
    } 
    int main() 
    { 
        char *str; 
        str=returnStr(); 
        printf("%s
    ", str); 
        return 0; 
    }

    这个没有任何问题,因为"hello world!"是一个字符串常量,存放在只读数据段,把该字符串常量存放的只读数据段的首地址赋值给了指针,所以returnStr函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。



    2、不能返回数组

    #include <stdio.h> 
    char *returnStr() 
    { 
        char p[]="hello world!"; 
        return p; 
    } 
    int main() 
    { 
        char *str; 
        str=returnStr(); 
        printf("%s
    ", str); 
        return 0; 
    } 

    "hello world!"是局部变量存放在栈中,而这里的p是指向"hello world!"的首地址。当returnStr函数退出时,栈要清空,局部变量的内存也被清空了,所以这时的函数返回的是一个已被释放的内存地址,所以有可能打印出来的是乱码。

    3、返回普通值

    int func()
    {
        int a;
        ....
        return a; //允许
    } 
    
    int* func()
    {
        int a;
        ....
        return &a; //无意义,不应该这样做
    } 

    直接返回a,返回的是值,结果存储在临时变量中;返回&a时,是a的地址,而函数结束后,栈要清空,a的内存也被清空了,故结果肯定会异常。


    4、可以把地址设置成static可正常返回

    #include <stdio.h> 
    char *returnStr() 
    { 
        static char p[]="hello world!"; 
        return p; 
    } 
    int main() 
    { 
        char *str; 
        str=returnStr(); 
        printf("%s
    ", str); 
        
        return 0; 
    } 

    5、可以返回指向堆内存的指针

    char *GetMemory3(int num)
    {
        char *p = (char *)malloc(sizeof(char) * num);
        return p;
    }
    void Test3(void)
    {
        char *str = NULL;
        str = GetMemory3(100);
        strcpy(str, "hello");
        cout<< str << endl;
        free(str);
    }



    长风破浪会有时,直挂云帆济沧海!
    可通过下方链接找到博主
    https://www.cnblogs.com/judes/p/10875138.html
  • 相关阅读:
    Django中查询相关操作
    django Field选项中null和blank的区别
    翻转链表和k个一组翻转以及两两反转
    一道腾讯面试题:如何快速判断某 URL 是否在 20 亿的网址 URL 集合中?
    struct-config.xml配置文件的解析
    taglib标签在web.xml文件中报错的解决办法
    解决html中的乱码问题
    css的学习笔记
    选择器要这么用!!!!66666
    什么是个CDN???CDN是干什么的??
  • 原文地址:https://www.cnblogs.com/judes/p/15023248.html
Copyright © 2011-2022 走看看