C语言 柔性数组

文章详细介绍了C99中的柔性数组特性,包括其定义方式和特点,如在结构体中作为最后一个成员,sizeof不计算其内存等。然后通过对比在结构体中使用柔性数组和普通指针的方式,展示了在内存分配、使用和释放上的差异,强调了柔性数组在内存管理上的便利性和效率优势。
摘要由CSDN通过智能技术生成

目录

一、柔性数组成员

二、柔性数组特点

三、结构中,柔性数组和指针的对比

1.在结构体中把最后一个成员设置为柔性数组

2.在结构体中把最后一个成员设置为指针

3.两种方式的对比


一、柔性数组成员

//C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员;

typedef struct st_type
{
	int i;
	int a[];//第一种写法;
	//int a[0];//两种写法适应不同编译器,意思一样;
}type_a;

二、柔性数组特点

//1.结构体中的柔性数组成员前,必须至少有一个其他成员;

//2.sizeof返回的含有柔性数组成员的结构体的大小,不包括柔性数组的内存;

//3.包含柔性数组成员的结构用malloc函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小;

typedef struct st_type
{
	int i;
	int a[];//柔性数组成员;
}type_a;
int main()
{
	printf("%d\n", sizeof(type_a));//输出:4;
	return 0;
}

三、结构中,柔性数组和指针的对比

1.在结构体中把最后一个成员设置为柔性数组

struct s
{
	int n;
	int arr[];//柔性数组成员;
};
int main()
{
	struct s* ps = (struct s*)malloc(sizeof(struct s) + 40);//使用malloc函数开辟空间,此时开辟的空间大小为 4+40 ;
	//注意判断是否成功开辟空间,此处忽略判断NULL;
	ps->n = 100;
	for (int i = 0; i < 10; i++)//赋值;
	{
		ps->arr[i] = i;
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	struct s* ptr = (struct s*)realloc(ps, sizeof(struct s) + 80);//使用realloc函数调整空间大小,此时将空间调整为 4+80 ;
	if (ptr != NULL)//如不为空指针;
	{
		ps = ptr;//将空间交给p;
		ptr = NULL;//ptr不再指向有效空间;
	}
	//使用完毕;
	free(ps);//释放并销毁;
	ps = NULL;
	return 0;
}

2.在结构体中把最后一个成员设置为指针

struct s
{
	int n;
	int* arr;
};
int main()
{
	struct s* ps = (struct s*)malloc(sizeof(struct s));//使用malloc函数开辟空间,此时开辟的空间大小为 4+4 ,这里面只包含了一个整型数据和一个整型指针的大小;
	//注意判断是否成功开辟空间,此处忽略NULL;
	ps->n = 100;
	ps->arr = (int*)malloc(40);//使用malloc函数开辟空间,此时开辟的空间大小为40,这里只是ps->arr的空间,和结构体s没有关系;
	//注意判断是否成功开辟空间,此处忽略;
	for (int i = 0; i < 10; i++)//赋值;
	{
		ps->arr[i] = i;
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	int* ptr = (int*)realloc(ps->arr, 80);//使用realloc函数调整空间大小,此时将空间调整为 80 ;
	//注意判断是否成功开辟空间,此处忽略
	if (ptr != NULL)//如不为空指针;
	{
		ps = ptr;//将空间交给p;
		ptr = NULL;//指针不再指向有效空间;
	}
	//使用完毕;前面的代码malloc函数使用了两次,此时应该将两个空间都释放;
	free(ps->arr); //将指针指向空间中的值销毁;
	free(ps); //指针不再指向有效空间;
	ps = NULL;
	return 0;
}

3.两种方式的对比

//两种方式能达成一样的效果,但是第二种方法不建议使用;

//使用柔性数组的优点和使用指针代替柔性数组的缺点:

        //1.使用柔性数组方便内存释放,使用指针代替柔性数组需要使用两次空间开辟函数,需要作多次空间释放销毁,容易忘记或出错;

        //2.使用柔性数组有利于访问速度,使用指针代替柔性数组多次开辟空间,容易使内存空间碎片化,降低内存利用率;

(-- end --)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值