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

提出问题

请问在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上与嵌入式相关的高星开源项目~

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

  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值