动态内存管理之柔性数组

柔性数组:
只存在于结构体中,而且还要是结构体的最后一个成员,并且在他的前面必须要有其他成员,
大小是未知的,所以在用sizeof计算出的结构体大小是出柔性数组外的,
动态内存管理之柔性数组_第1张图片
柔性数组的大小是可以变化的,那么如何调整柔性数组的大小呢,
想到调整大小我们就可以想到动态内存分配
所以我们可以首先用malloc函数为柔性数组开辟一个动态内存,
再用realloc函数调整空间大小
动态内存管理之柔性数组_第2张图片
想要实现这样的把结构体大小做调整的操作,除了在结构体中包含柔性数组外,我们还可以在结构体中包含指针


struct S {
	int a;
	int* arr;
};
int main()
{
	struct S* p=(struct S*)malloc(sizeof(struct S));//先定义一个结构体指针,并给开辟空间
	if (p == NULL)
	{
		perror("malloc->p");
		return 1;
	}
	p->arr = (int*)malloc(40);//然后再通过结构体指针找到arr指针,对arr指针指向的区域开辟空间
	if (p->arr == NULL)
	{
		perror("malloc->arr");
		return 1;
	}
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		p->arr[i] = i + 1;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", p->arr[i]);
	}
	//调整
	int* pc=(int*)realloc(p->arr, 60);
	if (pc == NULL)
	{
		perror("realloc");
		return 1;
	}
	p->arr= pc;
	for (i = 0; i < 15; i++)
	{
		printf("%d\n", p->arr[i]);
	}
	//释放
	free(p->arr);
	p->arr = NULL;
	free(p);
	p=NULL;
	return 0;
}

原理图
动态内存管理之柔性数组_第3张图片

你可能感兴趣的:(柔性数组,c语言,数据结构)