柔性数组与成员指针开辟内存

本文对比了C语言中使用柔性数组和指针开辟内存空间的方法。柔性数组在结构体中开辟连续空间,仅需一次free释放,利于访问速度和减少内存碎片;指针开辟的内存需要两次free,可能产生内存碎片。两种方法在功能上等效,但柔性数组在内存管理和效率上有优势。
摘要由CSDN通过智能技术生成

 先看两组代码

一组是使用柔性数组开辟空间

#include<stdio.h>
#include<stdlib.h>
struct S
{
	int n;
	int arr[];//创建柔性数组前必须要定义变量
};
int main()
{
	//printf("%d ", sizeof(struct ARR));//4	sizeof计算结构体大小只计算int n
	struct S*ps = (struct S*)malloc(sizeof(int)+5 * sizeof(int));//mollco开辟n的4个字节大小+数组arr的大小
	
		for (int i = 0; i < 5; i++)
		{
			*(ps->arr + i) = i;
		}
		struct S* ptr = realloc(ps, (4+40));
		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;
}
柔性数组的特点:
结构中的柔性数组成员前面必须至少一个其他成员。
sizeof 返回的这种结构大小不包括柔性数组的内存。
包含柔性数组成员的结构用 malloc () 函数进行内存的动态分配,并且分配的内存应该大于结构的大
小,以适应柔性数组的预期大小。

一组是使用arr指针开辟空间

#include<stdio.h>
#include<stdlib.h>
struct S
{
	int n;
	int *arr;
};
int main()
{
	structS* ps = (struct S*)malloc(sizeof(struct S));
	ps->arr = malloc(5*sizeof(int));
	for (int i = 0; i < 5; i++)
	{
		ps->arr[i] = i;
	}
	int* ptr = realloc(ps->arr, 10 * sizeof(int));
	if (ptr != NULL)
	{
		ps->arr = 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->arr);
	ps->arr = NULL;
	free(ps);
	ps = NULL;
	return 0;
}

两组代码都有相同的结果

区别在于:

柔性数组开辟的空间是连续的,free使用一次

arr指针开辟的是碎片的,free使用两次

代码 1 代码 2 可以完成同样的功能,但是 方法 1 的实现有两个好处:
1.方便内存释放
arr指针开辟的是碎片的,第二组要释放结构体的内存和成员的内存。而一组只有一个内存块需要释放。
2. 这样有利于访问速度 .
连续的内存有益于提高访问速度,也有益于减少内存碎片。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值