C语言中的柔性数组

柔性数组

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

struct S
{
	int n;
	int arr[ ];       //未知大小——柔性数组成员,数组的大小是可以调整的
}

int main()
{
   struct S s;
   printf(“%d\n”,sizeof(s));     //结果为4,在计算大小的时候,不计算柔性数组的成员
	return0;
}

结果:4
如何使用柔性数组呢?
实现方法1:

struct S
{
	int n;
	int arr[ ];       //未知大小——柔性数组成员,数组的大小是可以调整的
}

int main()
{
   struct S* ps=(struct S*)malloc(sizeof(struct S)+5*sizeof(int));
   ps->n=100;
   int i=0;
   for(i=0;i<5;i++)
   {
   		ps->arr[i]=i;   //0 1 2 3 4
   }
   //加入柔性数组太小了,我们应该如何增加它的内存(使用realloc)
   struct S* ptr = realloc(ps,44);
   //判断开辟的空间是否成功
   if(ptr !=NULL)
   {
		ps = tr;
   }
   for(i=5;i<10;i++)
   {
		ps->arr[i]=i;
   }
   for (i=0;i<10;i++)
   {
   		printf("%d",ps->arr[i])
    }
	return0;
}
struct S* ps=(struct S*)malloc(sizeof(struct S)+5*sizeof(int));

开创了24个字节,前面的4个字节是相当于给了n, 5*sizeof(int)这块内存是给数组开辟的。
以上代码展示了柔性数组可以变大也可以变小。

实现方法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]);
  }
  //调整大小
  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]);
  }
  //释放内存(注意释放内存的顺序)
  free(ps->arr);
  ps->arr=NULL;
  free(ps);
  ps=NULL;
  return0;
}

柔性数组的特点:

1.结构中的柔性数组成员前面必须至少一个其他成员
2.sizeof返回的这种结构大小不包括柔性数组的内存
3.包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小

柔性数组的优势

方法一的实现有两个好处:
1.方便内存释放
2.有利于访问速度

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值