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());
}
复制代码

 

该如何解决:

  • 使用静态变量
  • 使用全局变量

 

posted @   -零  阅读(2687)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2019-02-12 Shell学习之条件测试(四)
2019-02-12 Linux学习之RPM包管理-yum管理(十七)
2019-02-12 Shell学习之环境变量配置文件(三)
2019-02-12 Shell学习之Bash变量详解(二)
点击右上角即可分享
微信分享提示