打印
[核芯资讯]

C语言进阶 动态数组初始化方法,及三要素

[复制链接]
3844|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
powerantone|  楼主 | 2024-5-14 15:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
动态数组初始化
C语言中可以通过在堆上动态分配内存空间的方式来声明一个元素个数可变的动态数组,比如通过stdlib.h标准库中的malloc()函数或calloc()函数,其中后者可以将数组的每一个元素都初始化为0,而前者则不会进行该项的操作。

通常情况下,动态的数组在被使用之前应该被初始化。

初始化的三要素
C语言动态数组的初始化方法不止一种,这一章节将介绍的是其中的一种,使用循环来初始化?为什么要先介绍这种方法呢?原因如下:

动态数组的元素容量是可变的,使用循环来初始化,可以更好地操作数组的现有已经赋值的元素个数current_size和容量size这两个数据;

通过现有已赋值的元素个数current_size或实际的元素个数和容量size,可以更好地操作动态数组的内存空间,比如当实际元素个数比当前的容量小,则可以对其进行缩小,相反,则可以进行扩大,使内存空间的利用更加高效;

当current_size等于容量size的时候,就应当停止初始化,避免访问越界,要不然就动态地为数组扩容;

因此,动态数组的初始化的三要素可总结如下(个人理解,仅供参考):

循环、实时统计现有元素个数,以及数组的容量(个数,不是字节大小)。

动态数组初始化实例代码
#include "stdio.h"
#include "stdlib.h"

int main() {
    int current_size = 0;
    int size = 10;
    int *ptr = (int*)calloc(size, sizeof(int));
    // for循环初始化,特意设置为i<9,使数组保留一个元素未显式初始化
    if(ptr == NULL){
        printf("内存分配未成功!\n");
    }else{
        for(int i=0; i<9; i++){
            ptr[i] = i;
            current_size++;
            if(current_size == size){
            // 当实际元素个数等于容量size时,停止循环,避免访问越界
                printf("动态数组全部初始化完成!\n");
                break;
            }
        }
        if(current_size < size){
                printf("动态数组未全部初始化!\n");
                // 如果需要将动态数组的容量缩小,可以在这里设置
                // 本章暂且不介绍动态数组的容量修改的方法
                // 除此之外,还可以将size的大小设置为current_size
                // 留待后期使用
                // size = current_size;
        }
        // 访问最后一个元素,值为0,
        // 因为calloc()动态分配内存时会自动将每个元素初始化为0
        printf("%d\n",ptr[9]);
        printf("%d\n",ptr[5]); //访问其它位置的元素,查看赋值情况
        free(ptr);
        ptr = NULL;
    }

    return 0;   
}
代码编译后,得到输出:

动态数组未全部初始化!
0
5
实例代码提示
current_size和size的作用域应该是较广的,虽然不一定是全局的,其值应该也是动态可变的,因此,其标识符应该是比较有特点的,不应该像实例中的那样,看上去十分普遍,避免被随意使用、更改。

免责声明:内容仅供参考,不保证正确性。

使用特权

评论回复
沙发
tpgf| | 2024-6-4 15:22 | 只看该作者
这些函数都是单片机c语言支持的吧

使用特权

评论回复
板凳
八层楼| | 2024-6-4 16:03 | 只看该作者
如果在声明的时候不进行初始化 会由随机数进行填充吗

使用特权

评论回复
地板
观海| | 2024-6-4 19:37 | 只看该作者
需要再每次操作的时候都检查是否已经溢出了吗

使用特权

评论回复
5
晓伍| | 2024-6-4 20:09 | 只看该作者
不同的初始化方法所需要的指令周期是相同的吗

使用特权

评论回复
6
磨砂| | 2024-6-4 20:41 | 只看该作者
如果经常使用动态数据的话 会不会产生很多的内存碎片呢

使用特权

评论回复
7
木木guainv| | 2024-6-4 21:13 | 只看该作者
动态数组能到达链表的使用效果吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

543

主题

2301

帖子

4

粉丝