【C语言】记录一次自己犯下的低级错误 o(╯□╰)o(局部数组与指针数组的传参、赋值)

发布时间:2023年12月22日

在这里分享一下本人犯下的低级错误,希望大家别掉同样的坑 o(╥﹏╥)o

事情原委

事情是这样的: 在头歌平台做归并排序练习的时候,当我点击自测按钮后报错,才发现我没有对指针数组、局部数组进行正确的传参和赋值,感觉指针白学了(*/ω\*)
在这里插入图片描述

错误分析及解救办法

下面就开始盘点我犯下的错误吧。

错误一: 使用局部数组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 **********/
}

以上就是我掉的坑,在这里也希望大家引以为鉴。如果你也有类似经历,欢迎评论区留言,分享给更多的人。

在这里插入图片描述

文章来源:https://blog.csdn.net/2301_76435948/article/details/135160561
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。