【C语言】简单柔性数组知识

柔性数组

柔性数组是啥?

柔性数组,也叫做0长度数组,主要用途是为了满足改变长度的结构体

如何使用呢?

若要使结构体可变长度,在一个结构体最后申明一个长度为0的数组即可。对于编译器来说,这个长度为0的数组并不占用空间(数组名本身不占据空间,但代表了一个不可更改的地址常量)。

struct S
{
    int a;
    short b;
    char c;
    char p[];//结构体中不能只存在数组,前面需要有其他成员
};

我们通过动态分配来处理数组的大小问题

若是通过 malloc() calloc()等方法分配空间,需释放空间

优点

  1. 柔性数组相对于在结构体中声明一个指针变量再进行动态分配的方法,效率更高,因为访问数组内容时避免了两次访存。
  2. 分配连续内存,减少内存碎片化(因为指针分配的空间不是连续的,数组占用的空间是连续的)

看一段代码来帮助理解

#include<stdio.h>

struct S
{
    int a;
    short b;
    char c;
    char d[];
};

int main()
{
    //开辟空间
    struct S* p = (struct S*)malloc(sizeof(struct S) + 10);//预留十个字节
    if(p == NULL)
    {
        perror("error!");
        return 1;
    }
    //扩容
	struct S* ptr = (struct S*)realloc(p,sizeof(struct S) + 20);
    if(ptr == NULL)
    {
        perror("error!");
        return 1;
    }
    p = ptr;
    //使用
    //......
    //释放
    free(p);
    p = NULL;
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值