柔性数组详解

前言:柔性数组是C99中新添加的概念,它是结构体里面的最后一个成员,因为它的大小未知,所以很灵活,称之为柔

1 柔性数组占不占结构体的空间呢?

   不占

typedef struct Stu
{
	char y;
	int x;
	int arr[];//有些编译器不支持这样写,可以写成int arr[0],这个就是柔性数组
}St;
int main()
{
	//这里我们可以计算一下柔性数组到底计不计算空间
	printf("%d", sizeof(St));//这里涉及结构体的位段后面再说
	return 0;
}

我们看到结构体的大小是8,所以柔性数组是不占空间的

2 柔性数组怎么用

用动态内存开辟的方式用,我们来结合昨天的动态内存管理设计一下程序

typedef struct Stu
{
	char y;
	int x;
	int arr[];//有些编译器不支持这样写,可以写成int arr[0],这个就是柔性数组
}St;
int main()
{
	//这里我们可以计算一下柔性数组到底计不计算空间
	printf("%d\n", sizeof(St));//这里涉及结构体的位段后面再说
	St s = { 0 };
	St* p = NULL;
	p = &s;
	p = (St*)malloc(sizeof(int) * 10+sizeof(St));
	if (p == NULL)
		return 0;
	for (int i = 0; i < 10; i++)
	{
		p->arr[i] = i;
		printf("%d ", p->arr[i]);
	}
	//如果后面要多开辟空间的话
	p = (St*)realloc(p,sizeof(int) * 15 + sizeof(St));
	for (int i = 10; i < 15; i++)
	{
		p->arr[i] = i;
		printf("%d ", p->arr[i]);
	}
	free(p);
	p = NULL;
	return 0;
}

3 柔性数组的一种模拟实现(有缺陷,总的来说还是柔性数组好用)

因为柔性数组只需要释放一次堆区内存,并且柔性数组不占用结构体内存

typedef struct Stu
{
	char y;
	int x;
	int* arr;
}St;

int main()
{
	printf("%d\n", sizeof(St));//指针占用内存空间
	//先给结构体开辟空间
	St* p = (St*)malloc(sizeof(St));
	//然后指针指向的空间开辟
	p->arr = (int*)malloc(sizeof(int) * 10);
	//判断是否为空
	if (p == NULL || p->arr == NULL)
		return 1;
	//不为空继续下面的程序
	p->x = 1;
	p->y = 'w';
	for (int i = 0; i < 10; i++)
	{
		p->arr[i] = i;
		printf("%d ", p->arr[i]);
	}
	//用完后记得释放内存,先释放小的,再释放大的
	//如果你先释放大的话,那么指针arr没有了,怎么找arr指向的那块空间呢?
	free(p->arr);
	free(p);
	//然后置空
	p->arr = NULL;
	p = NULL;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/2301_79811170/article/details/134853549