在这里分享一下本人犯下的低级错误,希望大家别掉同样的坑 o(╥﹏╥)o
文章目录
- 事情原委
- 错误分析及解救办法
- 错误一: 使用局部数组arr并将其作为返回值
- 解决方法:使用动态内存分配来创建数组,并在函数结束前手动释放内存。
- 错误二:直接用非空局部数组接收返回值
- 解决办法:
- 输出结果:
- 附上本题归并排序代码
事情原委
事情是这样的: 在头歌平台做归并排序练习的时候,当我点击自测按钮后报错,才发现我没有对指针数组、局部数组进行正确的传参和赋值,感觉指针白学了(*/ω\*)
错误分析及解救办法
下面就开始盘点我犯下的错误吧。
错误一: 使用局部数组arr并将其作为返回值
在merge_array函数中,创建了一个局部数组arr并将其作为返回值。然而,当函数结束时,局部变量arr将被销毁,因此返回指向该数组的指针是不安全的。
解决方法:使用动态内存分配来创建数组,并在函数结束前手动释放内存。
错误二:直接用非空局部数组接收返回值
在merge_sort函数中,我将递归调用的结果赋值给局部数组left和right,但数组名是不可修改的,无法直接赋值。
解决办法:
可以改为使用指针来传递数组,并在函数内部进行操作。
输出结果:
附上本题归并排序代码
//
// sort_.cpp
// Sort
//
// Created by ljpc on 2018/4/20.
// Copyright © 2018年 ljpc. All rights reserved.
//#include "sort_.h"void print_array(int *arr, int n)
// 打印数组
{if(n==0){printf("ERROR: Array length is ZERO\n");return;}printf("%d", arr[0]);for (int i=1; i<n; i++) {printf(" %d", arr[i]);}printf("\n");
}int* merge_array(int *arr1, int n1, int* arr2, int n2)
// 编程实现两个有序数组arr1和arr2合并
// 函数参数:有序数组arr1 数组arr1长度 有序数组arr2 数组arr2长度
// 函数返回值:返回从小到大排序后的合并数组
{// 请在这里补充代码,完成本关任务/********** Begin *********/int *arr=(int *)malloc((n1+n2)*sizeof(int));int i=0;int j=0;int k=0;while(i<n1 && j<n2){if(arr1[i]<=arr2[j]){arr[k] = arr1[i];i++;}else{arr[k] = arr2[j];j++;}k++;}if(i<n1){while(i<n1){arr[k] = arr1[i];i++;k++;}}else if(j<n2){while(j<n2){arr[k] = arr2[j];j++;k++;}}return arr;/********** End **********/
}
int* merge_sort(int *arr, int n)
// 基于merge_array函数编程实现归并排序:自上而下的递归方法
// 函数参数:有序数组arr 数组arr长度
// 函数返回值:返回从小到大排序后的数组
{// 请在这里补充代码,完成本关任务/********** Begin *********/if(n<2){return arr;}int mid = n/2;int *left = (int*)malloc(mid * sizeof(int));int *right = (int*)malloc((n-mid) * sizeof(int));for(int i=0; i<mid; i++){left[i] = arr[i];}for(int j=mid; j<n; j++){right[j-mid] = arr[j];}left = merge_sort(left, mid);right = merge_sort(right, n-mid);int *merged = merge_array(left, mid, right, n-mid);free(left);free(right);return merged;/********** End **********/
}
以上就是我掉的坑,在这里也希望大家引以为鉴。如果你也有类似经历,欢迎评论区留言,分享给更多的人。