在这里分享一下本人犯下的低级错误,希望大家别掉同样的坑 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 **********/
}
以上就是我掉的坑,在这里也希望大家引以为鉴。如果你也有类似经历,欢迎评论区留言,分享给更多的人。