笔记-柔性数组的使用

柔性数组的使用:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>

struct S
{
	int i;
	int a[];
};
int main()
{
	struct S *s = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(int));
    //包含柔性数组的结构用malloc函数进行内存的动态化分配,并且分配的内存应该大于结构的大小,已以适应柔性数组的大小
	if (s == NULL)
	{
		printf("%s\n", strerror(errno));
		return;
	}
	s->i = 100;
	for (int k = 0; k < 10; k++)
	{
		s->a[k] = k;
	}
	printf("扩容前,a有:");
	for (int k = 0; k < 10; k++)
	{
		printf("%d ", s->a[k]);
	}

	stuct S*ptr = (struct S*)realloc(s,sizeof(struct S) + 20 * sizeof(int));
    
    //这里柔性数组的大小可以通过realloc函数进行扩容。
    if (ptr == NULL)
	{
		printf("%s\n", strerror(errno));
		return;
	}
    s = ptr;
	for (int k = 10; k < 20; k++)
	{
		s->a[k] = k;
	}
	printf("\n");
	printf("扩容后,a有:");
	for (int k = 0; k < 20; k++)
	{
		printf("%d ", s->a[k]);
	}
    free(s);
    s = NULL;
	return 0;
}

还有另一种方法和柔性数组的使用效果是一样的:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>

struct S
{
	int i;
	int *a;
};

int main()
{
	struct S *s = (struct S*)malloc(sizeof(struct S));
	//首先为结构申请空间。
	if (s == NULL)
	{
		printf("%s\n", strerror(errno));
		return;
	}
	s->i = 100;
	s->a = (int *)malloc(10 * sizeof(int));
    //再开辟空间,直接让指针a指向这块空间就行了。
	for (int k = 0; k < 10; k++)
	{
		s->a[k] = k;
	}
	for (int k = 0; k < 10; k++)
	{
		printf("%d ", s->a[k]);
	}
	printf("\n");
	int* ptr = (int*)realloc(s->a,20 * sizeof(int));
    //扩容直接让指针指向指向的空间进行扩容就行了,不需要让整个结构进行扩容。
	if (ptr == NULL)
	{
		printf("%s\n", strerror(errno));
		return;
	}
	s->a = ptr;
	for (int k = 10; k < 20; k++)
	{
		s->a[k] = k;
	}
	for (int k = 0; k < 20; k++)
	{
		printf("%d ", s->a[k]);
	}
    free(s);
    s = NULL;
    free(s->a);
    s->a = NULL;
	return 0;
}

总结:

方案1:malloc一次free一次,容易维护空间,不易出错。而且malloc次数少意味着内存碎片就会比较少,内存的使用率就会较高一些。

方案2:malloc两次,free两次,维护难度加大,容易出错。malloc次数多,内存锁片就会增多,内存的使用率就下降了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值