你的c语言老师介绍过柔性数组吗?没有的话不妨进来看看吧~~

柔性数组

💛💛笔记自取~ :柔性数组笔记💛💛

❤️欢迎喜欢学习C/C++的朋友互关一起努力!!
博主目前在学习C语言!!转码道路艰险,需要你们的支持!❤️



1. 什么是柔性数组

✨C99 中,结构体中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员

柔性数组成员前必须至少有一个成员


2. 柔性数组成员的创建

直接用一段代码感受吧💛

struct stu
{
    int a;
    int b[];//柔性数组成员
};

struct stu
{
    int a;
    int b[0];//柔性数组成员
    //这里b[0]并不是指数组元素为0,而是数组元素不确定
}

所以柔性数组又称0长度数组
以上两种写法都可以,需要根据编译器支持的类型去判断


3. 柔性数组成员特点

🔥🔥柔性数组成员应该注意以下特点:

  • sizeof(结构体),计算结构体大小不包括柔性数组成员的大小
  • 柔性数组成员用malloc或者calloc函数进行合理的内存的动态分配
  • 分配的内存应该大于结构体的大小

4. 两种方式创建柔性数组成员

我们给柔性数组成员分配一下动态内存空间看看

首先数数组外形的

🌟优点:方便释放,mallco次数少,不容易出现内存泄漏

struct stu
{
    int a;
    int b[];//柔性数组成员
};

int main()
{
    struct stu* st = (struct stu*)malloc(sizeof(struct stu) 
                                         + 4 * sizeof(int));
    //这样就完成了柔性数组内容的分配
    //现在的int b[]相当于 int b[4]
    
    if(st == NULL)
    {
        return -1;
    }
    else
    {
        st->a = 0;
        int i = 0;
        for(i = 0; i < 4; i++)
        {
            st->b[i] = i;            
        }
    }
    
    //空间不够大,继续申请开辟空间
    struct stu* s = (struct stu*)realloc(st, sizeof(struct stu) 
                                         + 8 * sizeof(int)); 
    free(st);
    st = NULL;
    
    if(s == NULL)
    {
        return -1;
    }
    else
    {
        int i = 0;
        for(i = 0; i < 8; i++)//b[]相当于一个b[8]
        {
            s->b[i] = i;            
        }
    }
    printf("%d", s->b[7]);//打印出来是7
    
    free(s);
    s = NULL;//结束释放内存
    
    return 0; 
}

🌟🌟看看指针类型的柔性数组成员是如何开辟的

  • 疑问:最后一个元素不是数组吗?为什么是指针?

  • 看下面代码的注释,你就知道了

🌟🌟优点:访问速度快

🌟🌟缺点:melloc过度,会导致内存碎片过多,降低空间利用率

struct stu
{
    int a;
    int* b;//柔性数组成员,指向一个整型的地址,目前还不能算数组
};

int main()
{
    struct stu* st = (struct stu*)malloc(sizeof(struct stu));
    //先给a分配好地址

    if (st == NULL)
    {
        return -1;
    }
    else//赋值
    {
        st->b = (int*)malloc(4 * sizeof(int));
        //现在给b分配4个整型大小的空间
        //b是空间起始位置地址,b可以看作一个数组的起始地址了,就可以当作是数组名
        if (st->b == NULL)
        {
            return -1;
        }
        else 
        {
            st->a = 0;
            int i = 0;
            for (i = 0; i < 4; i++)
            {
                st->b[i] = i;
            }
        }
        
    }
    printf("%d\n", st->b[3]);//打印3

    //空间不够大,继续申请开辟空间
    int* s = (int*)realloc(st->b, 8 * sizeof(int));
    //空间扩大

    if (s == NULL)
    {
        return -1;
    }
    else
    {
        st->b = s;//这样b又是空间起始地址,可以当作数组进行赋值
        int i = 0;
        for (i = 0; i < 8; i++)
        {
            st->b[i] = i;
        }
    }

    printf("%d\n", st->b[7]);//打印7
    //空间释放
    //先释放整个结构体mallco的空间
    free(st);
    st = NULL;
    free(s);
    s = NULL;


    return 0;
}

❗️❗️❗️中间过程额外要注意判断动态内存分配所返回的指针是否为空指针❗️❗️❗️


  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凛音Rinne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值