动态内存之柔性数组

文章对比了两种实现柔性数组的方法,一种是在结构体中直接包含数组,另一种是通过指针指向动态分配的内存。柔性数组的特点在于其内存分配的效率和方便性,只需一次动态开辟,且连续的内存空间有利于提高访问速度。文章还提到了realloc函数的使用,并指出柔性数组在内存释放上的优势。
摘要由CSDN通过智能技术生成

柔性数组的实现

struct S
{
	int n;
	int arr[0];
};
void vary_array(void)
{
	//struct S s;
	struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
	ps->n = 100;
	for (int i = 0; i < 5; i++)
	{
		ps->arr[i] = i;
	}
	struct S* ptr = realloc(ps, 44);
	if (ptr != NULL)
	{
		ps = ptr;

		for (int i = 5; i < 10; i++)
		{
			ps->arr[i] = i;
		}
		for (int i = 0; i < 10; i++)
		{
			printf("%d", ps->arr[i]);
		}
	}
	free(ps);
	ps = NULL;
}

类柔性数组的代码

struct Q
{
	int n;
	int *arr;
};
void vary_array_s(void)
{
	struct Q* ps = (struct Q*)malloc(sizeof(struct Q));
	ps->arr = malloc(5 * sizeof(int));
	ps->n=100;
	for (int i = 0; i < 5; i++)
	{
		ps->arr[i] = i;
		printf("%d", ps->arr[i]);
	}
	//add
	int* ptr = (int*)malloc(44);
	if (ptr != NULL)
	{
		ps->arr = ptr;
		for (int i = 5; i < 10; i++)
		{
			ps->arr[i] = i;
			printf("%d", ps->arr[i]);
		}

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

}

二者的差别

最大的差别很明显就是柔性数组的方式只用了一次动态开辟而第二种方式用了两次,就这个区别对代码的影响就已经非常大了。

柔性数组的特点

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

柔性数组的优势

方便内存释放

和第二种方法相比由于柔性数组只开辟了一次,更易于释放。

有利于访问速度

另外柔性数组方式开辟的空间是连续的,这样内存碎片会更少,对于访问的时间会更少。

另外对于realloc函数的用法我之前有误解,实际上realloc里面的news_size是是包括了旧空间的大小。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值