C语言如何实现动态数组?

article/2025/10/3 15:15:11

提出问题

请问在c语言里如何实现动态大小的数组啊,比如说int a[N];,这里N的值可以在程序中定,或者有什么方法可以实现类似的功能?总之只要在编译时不用制定数组大小就行。

分析问题

嵌入式系统的内存是宝贵的,内存是否高效率的使用,往往意味着嵌入式设备的高质量和高性能,有时我们所需的内存空间无法预先确定,这里使用静态数组的办法很难解决,所以高效的使用内存对我们来说是很重要的。

所以我们在自己编写C语言代码的时候,就应该学会使用动态数组,那么怎么实现呢?

静态数组与动态数组的区别

对于静态数组,一旦定义了,数组长度也就指定好了,系统将为它分配一个固定大小的空间,使用完无需释放,引用简单,但是创建后无法改变其大小,这在应用中是一个致命弱点!

对于动态数组,它可以随程序需要而重新指定大小,其创建麻烦,使用完必须由程序员自己释放,否则将会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。所以相对于静态数组的来说我们对于使用动态数组有很大的自由度。

动态数组的内存空间是从堆上分配的,通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配,程序员自己负责释放内存。

在创建动态数组的过程中要遵循以下原则:

  • 在创建的时候从外层往里层,逐层创建;

  • 在释放的时候从里层往外层,逐层释放。

如何创建动态数组?

下面是一个创建动态数组的例子,按照需求设置数组大小:

#include <stdio.h>
#include <stdlib.h>
int main(){int arrLen; int *array;int i;printf("please enter length:");scanf_s("%d", &arrLen);array = (int*)malloc( arrLen*sizeof(int) );if(!array){printf("create error!\n");exit(1); }for(i=0; i<arrLen; i++){array[i] = i+1;}for(i=0; i<arrLen; i++){printf("%d  ", array[i]);}printf("\n");free(array); system("pause");return 0;
}

运行结果:

使用内存中的数据

上面的代码中,我们通过下标array[i]来引用数组元素,这个静态数组没有什么区别。另外还可以通过指针来引用数组元素,对上面的程序稍作修改:

#include <stdio.h>
#include <stdlib.h>
int main(){int arrLen;int *array;int *arrayCopy;//用来指向具体的数组元素int i;  printf("please enter length:");scanf_s("%d", &arrLen);arrayCopy = array = (int*)malloc( arrLen*sizeof(int) );if(!array){printf("create error!\n");exit(1); }for(i=0; i<arrLen; i++){*arrayCopy++ = i+1;}arrayCopy = array;//重置到数组首地址for(i=0; i<arrLen; i++){printf("%d  ", *arrayCopy++);}printf("\n");free(array); system("pause");return 0;
}

需要注意的是,free() 函数必须释放整块内存,多定义一个变量 arrayCopy,不断改变它的值,以指向不同的数组元素。这样可以保证 array 变量的值不变,始终指向内存首地址,用于free()整块内存。

当然也可以动态创建多维数组,其原理都是一样的,并且需要遵循创建与释放的原则。

1.为什么说Arm-2D是小资源单片机的GUI人权卡!

2.有了这些小技巧,我的代码可以起飞了~

3.QP是什么,为什么在国内不为我们所熟悉?

4.突发!又一MCU大厂暂停接单!

5.对国产嵌入式操作系统,你了解多少?

6.GitHub上与嵌入式相关的高星开源项目~

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。


http://chatgpt.dhexx.cn/article/9BXj2Csg.shtml

相关文章

C的动态数组的详细知识(网上收集到的大量详细知识以及个人理解的汇总)

动态数组是指在声明时没有确定数组大小的数组&#xff0c;即忽略圆括号中的下标&#xff1b;当要用它时&#xff0c;可随时用ReDim语句重新指出数组的大小。使用动态数组的优点是可以根据用户需要&#xff0c;有效利用存储空间。 可以了解动态数组的详细定义 一.C版本动态数组…

动态数组C语言实现详解

目录 0、前言 一、动态数组数据结构 二、动态数组增删改查函数声明 三、数组创建 1、头部动态创建 2、头部静态创建 四、元素添加 五、元素删除 1、根据元素值删除 2、根据元素位置删除 六、元素修改 七、元素查找 八、数组清空 九、数组销毁 十、验证程序 0、前…

C语言实现 动态数组 处理任意类型数据

引言&#xff1a;动态数组在C/C、Java、Python等语言中应用广泛&#xff0c;高级语言一般通过调用类或接口等可以快捷使用&#xff0c;C语言实现动态数组需要手动构造&#xff0c;以下为实现过程。 1 结构体构造动态数组 typedef struct Array {void **p; //维护在堆区…

C语言创建动态数组

C语言创建动态数组 1.编写步骤 1. 添加所需头文件 stdlib.h 该头文件下包含的与分配存储区相关的函数如下&#xff1a; void* malloc (size_t size);//从堆中分配size字节的存储空间 void* calloc (size_t num, size_t size);//分配数组并将数组零初始化。为 num 个元素的数…

在OpenCV里实现开运算

前面学习腐蚀和膨胀算法,并且深刻地认识到它们的特性以及作用。如果由这两种组合出来的运算又有什么样的不同呢?比如一个图像先腐蚀后膨胀的操作,会有什么结果呢?因为腐蚀是把图片白色变小,膨胀又是把图片白色变大,是否会保持原图不变呢?带着这些问题来研究一下先腐蚀后…

OpenCV python 形态学 圆形开运算

处理流程 # -*- coding: utf-8 -*- # note : 形态学 开运算 圆形内核 处理 # --------------------------------import cv2 as cv import numpy as npdef opening_circle(img_bin, kernel_size10):# 形态学kernel np.zeros((kernel_size, kernel_size), np.uint8)center_…

腐蚀、膨胀、开运算、闭运算

一、腐蚀、膨胀、开运算、闭运算 腐蚀&#xff1a;图像中的高亮部分进行膨胀 膨胀&#xff1a;原图中的高亮部分被腐蚀&#xff0c;类似于领域被蚕食 开运算&#xff1a;先腐蚀再膨胀&#xff0c;可以去掉目标外孤立的点 闭运算&#xff1a;先膨胀再腐蚀&#xff0c;可以去掉目…

【youcans 的 OpenCV 例程200篇】137. 灰度开运算和灰度闭运算原理

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】137. 灰度开运算和灰度闭运算 5. 灰度级形态学 灰度级形态学将形态学操作从二值图像扩展到灰度图…

开闭运算

开运算和闭运算是将腐蚀和膨胀按照一定的次序进行处理。但这两者并不是可逆的&#xff0c;即先开后闭并不能得到原来的图像。 开运算 开运算是先腐蚀后膨胀&#xff0c;其作用是&#xff1a;分离物体&#xff0c;消除小区域。特点&#xff1a;消除噪点&#xff0c;去除小的干扰…

图像的形态学开操作(开运算)和闭操作(闭运算)的概念和作用,并用OpenCV的函数morphologyEx()实现对图像的开闭操作

大家看这篇博文前可以先看一看下面这篇博文&#xff0c;下面这篇博文是这篇博文的基础&#xff1a; 详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作 图像形态学腐蚀可以将细小的噪声区域去除&#x…

OpenCV-Python图像运算变换处理:开运算和闭运算以及不同核矩阵的影响分析

☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一、引言 在《OpenCV-Python图像处理&#xff1a;腐蚀和膨胀原理及erode、dilate函数介绍 https://blog.csdn.net/LaoYuanPython/article/details/109441709》等系列博文中老猿详细介绍了腐蚀和膨胀的原理、…

灰度级形态学 - 灰度开运算和灰度闭运算

目录 1. 介绍 2. code 1. 介绍 灰度级的开运算和闭运算和二值图像的处理一样&#xff0c;只不过一个作用于灰度图&#xff0c;一个作用于二值图像 灰度级的开运算公式为&#xff1a; 先对图像做腐蚀&#xff0c;然后对腐蚀的结果做膨胀运算 灰度级的闭运算公式为&#xff…

OpenCV(七)形态学操作2--开运算与闭运算

目录 概述&#xff1a; morphologyEX()函数 一、开运算&#xff08;分开&#xff09; 1、基础理论 1、作用&#xff1a; 2、代码 3、效果 二、闭运算&#xff08;封闭&#xff09; 1、基础理论 1、作用 2、过程 2、代码 3、效果 总代码 参考资料&#xff1a; 概述…

开运算—闭运算

转载&#xff1a;https://blog.csdn.net/hanshanbuleng/article/details/80657148 如果不了解腐蚀与膨胀原理的同学那请看我前一期博客哦&#xff01;&#xff09; 1.开运算 开运算 先腐蚀运算&#xff0c;再膨胀运算&#xff08;看上去把细微连在一起的两块目标分开了&…

Halcon形态学处理-腐蚀、膨胀、开运算、闭运算、顶帽运算和底帽运算

提示&#xff1a;文章参考了网络上其他作者的文章&#xff0c;以及相关书籍&#xff0c;如有侵权&#xff0c;请联系作者。 文章目录 前言一、腐蚀和膨胀1.腐蚀2.膨胀 二、开运算和闭运算1.开运算2.闭运算 三、顶帽运算和底帽运算1.顶帽运算2.底帽运算 总结参考文献 前言 图像的…

Opencv中的开运算和闭运算操作讲解(python实现)

文章目录 1.首先了解腐蚀和膨胀原理2.开运算&#xff08;1&#xff09;为什么开运算可以去白噪点呢&#xff1f;&#xff08;2&#xff09;.函数讲解&#xff08;3&#xff09;代码实战 3.闭运算&#xff08;1&#xff09;函数讲解&#xff08;2&#xff09;代码实战 1.首先了解…

膨胀 腐蚀 开运算 闭运算 matlab,11. 形态学膨胀、腐蚀、开运算、闭运算

1. 膨胀:对边界点进行扩充,填充空洞,使边界向外部扩张的过程。 2. 腐蚀:消除物体边界点,使边界向内部收缩的过程,把小于结构元素的物体去除掉。 3. 开运算: 先腐蚀后膨胀的过程称为开运算,作用:去除孤立的小点,毛刺,消除小物体,平滑较大物体边界,同时不改变其面积。 4. 闭…

开运算、闭运算及其所用

1.开运算 开运算 先腐蚀运算&#xff0c;再膨胀运算&#xff08;看上去把细微连在一起的两块目标分开了&#xff09; 开运算的效果图如下图所示&#xff1a; 开运算总结&#xff1a; &#xff08;&#xff11;&#xff09;开运算能够除去孤立的小点&#xff0c;毛刺和小桥&…

python --opencv图像处理形态学(开运算、闭运算、梯度运算、顶帽运算、黑帽运算)

引言 前面介绍了图像形态学的两种基础算法&#xff0c;图像腐蚀和图像膨胀&#xff0c;本篇接着介绍图像形态学中的开运算、闭运算以及梯度运算。 需要了解清楚图像的腐蚀与膨胀基础原理,不然真的没办法理解开运算和闭运算。 第一件事情还是给图像增加噪声&#xff0c;思路沿…

二值图像开闭运算matlab,【数字图像处理】图像开运算与闭运算

图像开启与闭合 图像开运算与闭运算与膨胀和腐蚀运算有关&#xff0c;由膨胀和腐蚀两个运算的复合与集合操作(并、交、补等)组合成的所以运算构成。 开运算与闭运算依据腐蚀和膨胀的不可逆性&#xff0c;演变而来。 开运算&#xff1a;先对图像腐蚀后膨胀 闭运算&#xff1a;先…