【C++踩坑记录】返回值为数组名的问题

我在写快速排序的时候,由于需要返回两个数值,所以我就想着使用数组,但是当我将数组名作为返回值的时候就出了问题

代码如下:

int* quick_partion(int arr[], int left, int right){
   int less = left - 1;
   int more = right;
   int p = left;
   while(p < more){
      if(arr[p] < arr[right]){
         swap(arr, ++less, p++);
      }
      else if(arr[p] > arr[right]){
         swap(arr, --more, p);
      }
      else{
         p++;
      }
   }
   swap(arr, more, right);
   int bound[]={less+1, more};
   return bound;
}

我的想法就是使用数组名作为指针将数组返回,但是,当我这么做的时候,程序报错:

Process finished with exit code -1073741819 (0xC0000005)

我进行调试,报错:

Signal: SIGSEGV (Segmentation fault)

Signal: SIGSEGV (Segmentation fault)

在这里我意识到了可能是堆栈的问题,回过头去检查代码,发现问题所在

   int bound[]={less+1, more};
   return bound;

这样返回在语法上没有问题,但是,在函数中创建的数组是创建在栈中的,他的生命周期只在函数内,一旦出了函数作用域,该数组就会被销毁,指针就指向了一片不可控的区域,程序会崩溃。所以,应该通过动态创建数组的方式,将指针所指向的内存分配到堆上,这样在程序结束前,只有人工的释放语句才会使其消失。

具体修改如下:

int* quick_partion(int arr[], int left, int right){
   int less = left - 1;
   int more = right;
   int p = left;
   while(p < more){
      if(arr[p] < arr[right]){
         swap(arr, ++less, p++);
      }
      else if(arr[p] > arr[right]){
         swap(arr, --more, p);
      }
      else{
         p++;
      }
   }
   swap(arr, more, right);
   int* bound = get_arr(2);
   bound[0] = less + 1;
   bound[1] = more;
   return bound;
}

其中,get_arr函数为:

int* get_arr(int size){
   int* p = (int*)malloc(sizeof(int) * size);
   return p;
}

这样程序就能顺利执行了

总结:主要就是堆栈和生命周期的问题,这种小问题以后还需要更加细心一点,检查代码仔细一点

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值