柔性数组有什么用?

目录

一、概念

1.定义

2.特点

二、举例

代码解释

注意事项

三、优点


一、概念

1.定义

柔性数组(Flexible Array Member)是一种在C语言中使用的特殊数据结构。简单来说,柔性数组就是结构体内的最后一个元素是大小未知的数组。

2.特点

1.柔性数组前面必须要有其他成员。

2.sizeof计算结构体内存大小的时候是不计算柔性数组的大小的。

struct S
{
	int n;
	int arr[];
};

int main()
{
   //sizeof返回的这种结构体大小不包括柔性数组的内存
   int sz = sizeof(struct S);
   printf("%d ", sz);
   struct S s;//4,不包括柔性数组

   return 0;
}

3.包含柔性数组的结构体的内存大小需要用malloc分配,分配的大小必须要大于结构体自身的大小,否则柔性数组就不能使用了。

二、举例

struct S
{
	int n;
	int arr[];
};
int main()
{
	//柔性数组的使用
	struct S* ps = (struct S*)malloc(sizeof(struct S) + 40);
	if (ps == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	ps->n = 100;
	int i = 0;
	for (; i < 10; i++)
	{
		ps->arr[i] = i;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 80);
	if (ptr != NULL)
	{
		ps = ptr;
	}

	free(ps);
	ps = NULL;
	return 0;
}

代码解释

1.首先定义了一个结构体 struct S,它有一个整型成员 n 和一个不定大小的数组 arr[]。

struct S  
{  
    int n;  
    int arr[];  
};

2.在 main 函数中,首先通过 malloc 分配了一块内存,这块内存的大小是 struct S 的大小加上40个整型的空间。然后通过强制类型转换将这块内存的地址赋给了一个 struct S 类型的指针 ps。

struct S* ps = (struct S*)malloc(sizeof(struct S) + 40);

3.如果内存分配失败(malloc 返回 NULL),则打印错误信息并返回1。
4.接着,给 ps 的 n 成员赋值为100,然后在一个循环中给 arr[] 数组赋值为0到9。
再接下来的循环中,打印出 arr[] 数组的值。
5.然后,通过 realloc 重新分配内存,这次的大小是原来的大小加上80个整型的空间。如果分配成功,则更新 ps 的值。
6.最后,释放 ps 所指向的内存,并把 ps 置为 NULL。
7.主函数返回0,程序结束。

注意事项

这段代码主要展示了如何使用 "柔性数组成员",但需要注意,这种方式在某些情况下可能会导致内存分配的不连续,从而影响性能。同时,在使用 malloc 和 realloc 时,需要确保正确处理内存分配失败的情况 

三、优点

  1. 方便内存释放:由于柔性数组是动态分配的,因此我们只需要在程序结束时释放相应的内存即可,而不需要像传统数组那样需要逐个手动释放内存。
  2. 有利于访问速度:由于柔性数组是根据实际需要动态分配的,因此在访问时可以更快地找到所需的数据,提高了程序的运行效率。
  3. 方便扩展:柔性数组可以根据实际需要随时扩展或收缩,使得程序更加灵活和可维护。
  4. 提高内存利用率:由于柔性数组可以根据实际需要动态分配内存,因此可以更充分地利用内存空间,避免内存浪费。

总结:柔性数组是一种非常实用的数据结构,它可以提高程序的效率和可维护性,同时也方便了我们的代码编写和内存管理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值