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

news/2024/11/8 18:04:19/

在这里分享一下本人犯下的低级错误,希望大家别掉同样的坑 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 **********/
}

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

在这里插入图片描述


http://www.ppmy.cn/news/1278511.html

相关文章

核货宝订单管理系统提高企业效率

核货宝订单管理系统可以帮助企业提高效率&#xff0c;具体体现在以下几个方面&#xff1a; 一、订单自动化处理&#xff1a;核货宝订单管理系统支持订单批发和多渠道订单导入&#xff0c;它可以从订单的接收、处理、跟进、发货、到售后服务等环节都可以通过系统自动完成&#x…

Node.js安装部署

Node.js安装部署 在 Windows 上安装 Node.js1.使用安装程序2.使用包管理器 Chocolatey 安装 在 macOS 上安装 Node.js1.使用 Homebrew 安装 在 Linux 上安装 Node.js1.使用包管理器安装2.使用 Node.js 官方二进制包 安装完成验证 Node.js 是一个基于 Chrome V8 引擎的 JavaScri…

Qt WebAssembly开发环境配置

目录 前言1、下载Emscripten SDK2、 安装3、环境变量配置4、QtCreator配置5、运行示例程序总结 前言 本文主要介绍 Qt WebAssembly 开发环境的配置。Qt for Webassembly 可以使Qt应用程序在Web上运行。WebAssembly&#xff08;简称Wasm&#xff09;是一种能够在虚拟机中执行的…

Linux--Shell脚本应用实战

实验环境 随着业务的不断发展&#xff0c;某公司所使用的Linux服务器也越来越多。在系统管理和维护过程中&#xff0c;经 常需要编写一些实用的小脚本&#xff0c;以辅助运维工作&#xff0c;提高工作效率。 需求描述 > 编写一个名为getarp.sh的小脚本&#xff0c;记录局域…

27. 过滤器

Filter(过滤器)简介 Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截&#xff0c;从而在 Servlet 进行响应处理的前后实现一些特殊的功能。在 Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序&#xff1a;Filter, FilterChain, FilterConfigFi…

HFish蜜罐搭建及简单使用

一、HFish蜜罐 HFish是一款社区型免费蜜罐&#xff0c;侧重企业安全场景&#xff0c;从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发&#xff0c;为用户提供可独立操作且实用的功能&#xff0c;通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷感知和威胁情报领域的…

SpringBoot不求甚解,Java小白入门(二)

一、什么是SpringBoot&#xff1f; 其实Springboot是Spring家族中的一个全新的框架&#xff0c;它是用来简单应用程序的创建和开发过程&#xff0c;化繁为简。 二、为什么要用SpringBoot&#xff1f; 因为现在大部分产品都是直接以SpringBoot为脚手架开发了&#xff0c;主流…

使用Flask逐步搭建Web应用程序

大家好&#xff0c;Flask是一个使用Python编写的轻量级Web应用框架。它被设计成简单、易于学习和使用的&#xff0c;同时具备足够的灵活性和扩展性&#xff0c;以满足各种规模的Web应用开发需求。本文我们将介绍一个使用Flask逐步搭建Web应用程序的简单入门示例。 1.安装Flask…