关于C++函数返回指针的情况

本文理解借鉴为什么不可以返回局部变量的指针
首先要明确,局部变量的指针,与局部指针变量的区别
局部变量的指针,若非static,则作用域仅为函数本身,在return之后即被释放,也即指针指向一个无效变量,因此不合理
而局部指针变量则不同,尽管指针变量本身的生命期在return之后也结束,但只要其指向对象有效,其地址也是有效的
开头链接中提到例子:

//例1
int *f1()
{
   int x = 10;
   return &x;
}
//例2
int *f2(int a[],int n)
{
   int *p=a[0];
   int i;
   for(i=1;i<n;i++)
   {
       if(*p<a[i])
            p=&a[i];/*p指向更大的数*/
   }
   return p;
}

例1为局部变量的指针,若仅为这一个函数,会发现输出为10看似正确,但实则为x的这部分栈空间虽所有权不归x,但也并未被占用,若在庞大的系统中,x的地址被占用,则值不为预期的,因此是错误的
而例2中,指针p指向数组a的空间,而a这部分作为实参传递,函数结束后依旧有效,因此p指向数组中的最大值,返回也依旧有效
再看几个例子:

//例3
int *f3()
{
   static int x = 10;
   return &x;
}
//例1
int *f4()
{
   int* x = new int(19);
   return x;
}

例3和4都是合理的,因为例3的x为静态变量,在第一次函数调用时被初始化,之后的运行过程中一直存在,因此返回其引用也合理;
而例4则是因为申请了堆上的内存,在delete之前是一直有效的,也因此要注意new或malloc的空间,一定不能忘记delete或free

  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值