【C语言进阶】柔性数组

在这里插入图片描述

目录

  • 一:柔性数组的特点
  • 二:柔性数组的使用
  • 三:模拟实现柔性数组

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

以下是柔性数组的两种写法:

//写法一:
struct S
{
	int n;
	char c;
	char arr[];//数组大小没有写说明它的大小是未知的 - - 柔性数组成员
};

//写法二:
struct S
{
	int n;
	char c;
	char arr[0];//0也说明它的大小是未知的 - - 柔性数组成员
};

一:柔性数组的特点

  • 结构体中的柔性数组成员前面必须至少一个其他成员
  • sizeof返回的这种结构体大小不包括柔性数组的大小
  • 包含柔性数组成员的结构体malloc函数进行动态内存分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小。
//利用malloc进行空间分配
struct S
{
	int n;
	char arr[];//数组大小没有写说明它的大小是未知的 - - 柔性数组成员
};

int main()
{
	printf("%d\n", sizeof(struct S));
	struct S* ps = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(char));//后面的10 * sizeof(char)就是为arr数组开辟的
	return 0;
}

二:柔性数组的使用

#include 
#include 

struct S
{
	int n;
	char arr[];//数组大小没有写说明它的大小是未知的 - - 柔性数组成员
};

int main()
{
	printf("%d\n", sizeof(struct S));
	struct S* ps = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(char));//后面的10 * sizeof(char)就是为arr数组开辟的
	if (ps == NULL)
	{
		perror("malloc");
		return 1;
	}
	//使用
	ps->n = 100;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		ps->arr[i] = 'a';
	}
	for (i = 0; i < 10; i++)
	{
		printf("%c ", ps->arr[i]);
	}
	//增容
	struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 20 * sizeof(char));
	if (ptr == NULL)
	{
		perror("realloc");
		return 1;
	}
	else
	{
		ps = ptr;
	}
	//释放
	free(ps);
	ps = NULL;
	return 0;
}

三:模拟实现柔性数组

struct S
{
	int n;
	char* arr;
};

int main()
{
	struct S* ps = (struct S*)malloc(sizeof(struct S));
	if (ps == NULL)
	{
		perror("malloc");
		return 1;
	}
	//为arr开辟指向的空间
	ps->arr = (char*)malloc(sizeof(char) * 10);//开辟10个字符型的空间
	if (ps->arr == NULL)
	{
		perror("malloc");
		return 1;
	}
	//使用
	ps->n = 100;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		ps->arr[i] = 'a';
	}
	for (i = 0; i < 10; i++)
	{
		printf("%c ", ps->arr[i]);
	}
	//增容
	char* ptr = (char*)realloc(ps->arr, sizeof(char) * 20);
	if (ptr == NULL)
	{
		perror("realloc");
		return 1;
	}
	else
	{
		ps->arr = ptr;
	}
	//使用
	for (i = 0; i < 20; i++)
	{
		*((ps->arr)+i) = 'b';
	}
	for (i = 0; i < 20; i++)
	{
		printf("%c ", *((ps->arr) + i));
	}
	//释放
	free(ps->arr);
	ps->arr = NULL;
	free(ps);
	ps = NULL;
	return 0;
}

 常规的柔性数组,只需要malloc一次,free一次,并且空间是连续的,而模拟实现的柔性数组需要malloc两次,free两次,并且空间可能不连续。malloc的次数越多,越容易出错,可能出现忘记释放导致内存泄漏问题。此外,malloc的次数越多,产生的内存碎片就越多,内存利用率就会下降,造成内存空间浪费,malloc次数越少,产生的北村碎片就越少,内存利用率就会增加,会避免内存空间浪费。并且空间连续的情况下,访问数据的时候效率就会更高。

 今天的分享到这里就结束啦!如果觉得文章还不错的话,记得三连支持一下小恐龙,您的支持就是小恐龙前进的动力!


【C语言进阶】柔性数组_第1张图片

你可能感兴趣的:(进阶C语言,c语言,柔性数组,算法)