详解柔性数组

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

 

柔性数组的特点:

1.结构体中的柔性数组成员前面必须至少一个其他成员

2.sizeof返回的这种结构大小不包括柔性数组的内存

3.包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

 

 

代码1:柔性数组

//struct S

//{

//      int n;

//      int arr[];//未知大小的数组

//};



struct S

{

        int n;

        int arr[0];//未知大小的数组 -柔性数组成员 -数组的大小是可以调整的

};



int main()

{

        struct S s;

        printf("%d\n", sizeof(s));//4 -计算结构体大小的时候 不包含柔性数组成员



        struct S *ps = (struct S*) malloc(sizeof(struct S) + 5 * sizeof(int));



        int i = 0;

        for (i = 0; i < 5; i++)

        {

               ps->arr[i] = i;

        }

        for (i = 0; i < 5; i++)

        {

               printf("%d ", ps->arr[i]);//0 1 2 3 4

        }



        struct S* ptr = realloc(ps, 44);

        if (ptr != NULL)

        {

               ps = ptr;

        }



        for (i = 5; i < 10; i++)

        {

               ps->arr[i] = i;

        }

        for (i = 0; i < 10; i++)

        {

               printf("%d ", ps->arr[i]);//0 1 2 3 4 5 6 7 8 9

        }



        //释放

        free(ps);

        ps = NULL;



        return 0;

}

 

代码2:没有使用柔性数组

struct S

{

        int n;

        int* arr;

};



int main()

{

        struct S *ps = (struct S*)malloc(sizeof(struct S));

        ps->arr = malloc(5 * sizeof(int));



        int i = 0;

        for (i = 0; i < 5; i++)

        {

               ps->arr[i] = i;

        }

        for (i = 0; i < 5; i++)

        {

               printf("%d ", ps->arr[i]);//0 1 2 3 4

        }



        //调整大小

        int *ptr = realloc(ps->arr, 10 * sizeof(int));

        if (ptr != NULL)

        {

               ps->arr = ptr;

        }



        for (i = 5; i < 10; i++)

        {

               ps->arr[i] = i;

        }

        for (i = 0; i < 10; i++)

        {

               printf("%d ", ps->arr[i]);//0 1 2 3 4 5 6 7 8 9

        }



        free(ps->arr);//先释放

        ps->arr = NULL;

        free(ps);//后释放 如果先释放 后面就会找不到ps->arr

        ps = NULL;



        return 0;

}

代码1和代码2可以完成同样的功能,但是使用方法1(柔性数组)有两个好处:

1.方便内存释放

把结构体的内存以及其成员要的内存一次性分配好,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。

2.提高访问速度

连续的内存有助于提高访问速度,也有助于减少内存碎片。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值