【C语言】柔性数组使用与优点

1.柔性数组方法
结构体所占内存空间为4个字节,int arr[0]不占内存空间大小。利用malloc将开辟24个连续字节的空间,并将地址交由struct s ps*来维护。
但24个字节空间不够使用时,利用realloc扩大内存空间至44字节。在判断新开辟空间的指针是否为空指针,最后只要释放一次。

#include<stdio.h>
#include<stdlib.h>
struct s
{
 int n;
 int arr[0];
};
int main()
{
 struct s* ps = (struct s*)malloc(sizeof(struct s) + 5 * sizeof(int));
 ps->n = 10;
 int i = 0;
 for (i = 0; i < 5; i++)
 {
  ps->arr[i] = i;
 }
 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]);
 }
 printf("\n");
 free(ps);
 ps = NULL;
}

2.等价替代柔性数组
此时结构体里面创建二块内存,并不连续。

struct s
{
 int n;
 int* arr;
};

先用malloc创建整体内存空间交由指针struct sps来维护,在用int指针来开辟新的内存空间。

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;
 }
 

空间不足时,利用realloc开辟新的内存空间。

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]);
 }
 

最后释放内存空间,先ps->arr释放,其包含在指针ps所维护的空间,所以先释放ps->arr开辟的空间,在释放ps所指向的空间。

free(ps->arr);
 ps->arr = NULL;
 free(ps);
 ps = NULL;

3.柔性数组的优点:
一、方便内存的释放
如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户。用 户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发 现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体 指针,用户做一次free就可以把所有的内存也给释放掉。
二、提高访问速度
连续的内存有益于提高访问速度,也有益于减少内存碎片。
github源码(https://github.com/bijian0530/CSDN)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值