我在写快速排序的时候,由于需要返回两个数值,所以我就想着使用数组,但是当我将数组名作为返回值的时候就出了问题
代码如下:
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;
}
这样程序就能顺利执行了
总结:主要就是堆栈和生命周期的问题,这种小问题以后还需要更加细心一点,检查代码仔细一点