柔性数组的使用

本文介绍了C99中的柔性数组概念,展示了其在结构体中的应用,以及如何与动态内存管理(malloc/realloc)结合,同时提供了模拟实现柔性数组的方法,强调了合理分配和释放内存的重要性。
摘要由CSDN通过智能技术生成

1.什么是柔性数组

c99中规定,结构体中最后一个元素允许是未知大小的数组,叫做柔性数组.
从这里看出柔性数组只会出现在结构体当中.下面写一个简单的代码认识一下柔性数组
 

struct stu
{
    int i;
    int a[0];
};


上面代码中a就是一个柔性数组,当然a后面的[ ],里面的0;可写可不写,取决于编译器.
当一个结构体中存在柔性数组时,不会计算柔性数组的大小,上面这个结构体大小为4个字节.


2.柔性数组与动态内存相结合

当柔性数组与动态内存相结合时,其实就是为柔性数组开辟一个空间,空间大小可以修改,这就体现了柔性数组的特点.那么请看下面这段代码:

struct S
{
    int i;
    int arr[];
};
int main()
{
    struct S *p->arr=(struct S *)malloc(20);
    if(p==NULL)
    {
        perror("malloc");
        return 1;
    }
    p->i=100;
    for(int j=0;j<10;j++)
    {
        p->arr[j]=j;

    }
    //如果空间不够用,可以再开辟;
    struct S *ptr=realloc(ps,sizeof(struct S+15*sizeof(int));
    //其中15*sizeof(int)就是为数组开辟的空间大小
    //...可以一直开辟.
    if(ptr==NULL)
    {
        perror("realloc");
    }
    else
    {
        ps=ptr;
    }
    //...
    //如果不适用及时释放;并置为NULL
    free(ps);
    ps=NULL;    //防止ps成为野指针;
    return 0;
}

通过上面的代码可以看出,可随便改变柔性数组的大小,使用起来也很方便.

3.模拟实现柔性数组

看下面一段代码
 

struct ST
{
    int i;
    int*arr;
     
};

int main()
{
    struct ST * ps=(struct ST*)malloc(sizeof(struct ST));
    此时开辟的是ST这个结构体的大小的空间
    if(ps==NULL)
    {
        perror("malloc");
        return 1;  //NULL返回1
    }
    //使用开辟的空间
    ps->i=100;
    //为柔性数组开辟空间大小为5*4=20个字节;
    ps->arr=(int *)malloc(5*sizeof(int));
    if(ps->arr==NULL)
    {
        perror("malloc");
        return 1;
    }
    //使用开辟的空间
    for(int j=0;j<10;j++)
    {
        ps->*(arr+j)=j;
    
    }
    //发现数组不够用,那再开辟空间
    int * ptr=(int *)realloc(ps-arr,15*sizeof(int));
    if(ps->ptr==NULL)
    {
        perror("realloc");
        return 2;
    }
    else
    {
        ps->arr=ptr;
    }
    for(int j =0;j<10;j++)
    {
        ps->*(arr+j)=j;
    }
    
    free(ps->arr);
    ps->arr=NULL;
    free(ps);
	ps = NULL;
    return 0;
}

上面这段代码也是使用柔性数组的一种方法,这种方法会比上面使用柔性数组性能高一点(高不了多少),但是这中方法如果空间不够用,会开辟多处空间,这时就要注意,在释放空间的时候要释放多次,并且及时将指针置为空.

以上就是柔性数组的使用.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值