【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;
}

这样程序就能顺利执行了

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

你可能感兴趣的:(C++踩坑记录,c++)