C语言笔记——动态内存函数6

122 阅读1分钟

​一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。​

柔性数组:

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

柔性数组的特点:

1.结构中的柔性数组成员前面必须至少一个其他成员。

typedef struct st_type
{
    int i;
    int a[];//柔性数组成员
}



2.sizeof返回的这种结构大小不包括柔性数组的内存。

struct S
{
	int n;
	int arr[];//柔性数组成员
};

int main()
{
	printf("%d\n", sizeof(struct S));
	return 0;
}

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

使用:

struct S
{
	int n;
	int arr[0];//未知大小的-柔性数组成员-数组的大小是可以调整的
};
int main()
{
	struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
	return 0;
}

如果不使用柔性数组

struct S
{
	int n;
	int* arr;
};
int main()
{
	struct S* ps = (struct S*)malloc(sizeof(struct S));
	ps->arr = malloc(5 * sizeof(int));

	int i = 0;
	for (i = 0; i < 5; i++)
	{
		ps->arr[i] = i;
	}
	for (i = 0; i < 5; i++)
	{
		printf("%d", ps->arr[i]);
	}
	//调整大小
	int *ptr = relloc(ps->arr, 10 * sizeof(int));
	if (ptr != NULL)
	{
		ps->arr = ptr;
	}
	for (i = 5; i < 10; i++)
	{
		ps->arr[i] = i;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d", ps->arr[i]);
	}
	//释放内存
	free(ps->arr);
	ps->arr = NULL;
	free(ps);//释放两次
	return 0;
}

使用柔性数组有两个好处:

1.方便内存的释放

如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。

2.利于访问速度:连续的内存有益于提高访问速度