zoukankan      html  css  js  c++  java
  • C语言中关于返回局部指针变量与引用

    原则:尽量不要返回一个局部变量的指针或引用,因为函数执行完之后,将释放分配给局部变量的存储空间,局部变量只是临时的存储空间,此时,对局部变量的引用和地址就会返回不确定的内存,但可以返回局部变量本身,局部变量实际上是返回变量值的拷贝,虽然在函数调用结束后所在内存会被释放回收掉,但返回值不是地址,而是局部变量的拷贝副本。

    1.返回局部变量(没有问题)

    #include <stdio.h>  
    #include <string.h>  
    
    int add(int x, int y)
    {
        int sum = x + y;
        return sum;
    }
    
    int main()
    {
        int a = 3, b = 5;
        printf("%d+%d=%d",a,b,add(a,b));
    }

    2.返回局部变量指针(出现错误)

    #include <stdio.h>  
    #include <string.h>  
    
    int* add(int x, int y)
    {
        int sum = x + y;
        return &sum;
    }
    
    int main()
    {
        int a = 3, b = 5;
        printf("%d+%d=%d",a,b,*add(a,b));
    }

    总结

    局部变量:

    局部变量分为局部自动变量和局部静态变量,无论自动还是静态,返回局部变量都是没有问题的,因为返回值不是地址,虽然在函数调用结束后(栈区)局部变量的内存会被释放回收掉,但函数返回的是变量拷贝副本。

    局部指针:

    局部指针分为局部静态指针和局部自动指针,可以返回一个局部静态指针的地址,但不应该返回一个局部自动指针的地址,除非自动指针的地址指向数据区或堆区。

    返回局部静态指针变量的情况:

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

    返回局部自动指针,但指向数据区的情况:

    #include <stdio.h>  
    #include <string.h>  
    
    char * test(){
        char *arr = "hello world"; //字符常量
        return arr;
    }
    
    int main()
    {    
        printf("%s",test());
    }

    该如何解决:

    • 使用静态变量
    • 使用全局变量
  • 相关阅读:
    [转]win7 系统装SQLServer2000 成功。
    Windows CE 电源管理(转贴)
    [转]Win7系统下VS2005_2008不识别WinCE5 SDK
    [转]windows 7 下ASP.net 本地配置 ( IIS 7)
    [转]SelectObject() 装载字体 VC EVC
    Mobile Development: Disable Windows Mobile 6.5 Start and Close Button
    [转]WebForm 与 winform 路径获取
    1. chromedriver的下载和配置
    Slf4j打印异常的堆栈信息
    写个日志请求切面,前后端甩锅更方便
  • 原文地址:https://www.cnblogs.com/-wenli/p/12298711.html
Copyright © 2011-2022 走看看