欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言中的柔性数组你真的了解吗

程序员文章站 2022-04-15 11:07:08
目录柔性数组概念:特点:与指针动态开辟的比较指针动态开辟柔性数组指针动态开辟的缺点总结柔性数组概念:柔性数组就是一种特殊的数组它也是结构体最后一个成员也就是说,它存在结构体最后一个成员的位置上特点:1...

柔性数组概念:

柔性数组就是一种特殊的数组

它也是结构体最后一个成员

也就是说,它存在结构体最后一个成员的位置上

特点:

1.柔性数组在结构体的大小是未知的,在sizeof中不计算其大小

#include<stdio.h>
struct s
{
	int n ;
	int arr[0];//或者int arr[];
};
main()
{
	printf("the size of the structure is  %d",sizeof(struct s));
	return 0;
}

C语言中的柔性数组你真的了解吗

2.在结构体中,如果存在柔性数组,就必须满足它的前面含有其它的成员,来申请空间,,因为他的大小本身是未知的,不计算大小。

3.包含柔性数组的结构体要靠malloc去动态申请这块空间,这就体现了柔性数组的柔,也就是可以控制大小,且分配的空间一定满足大于其它成员的大小。

与指针动态开辟的比较

在日常的编程中,有时候需要在结构体中存放一个长度动态的数组

一般的做法,是在结构体中定义一个指针成员,这个指针成员指向该数组所在的动态内存空间

指针动态开辟

#include<stdio.h>
struct s
{
	int n;
	int* arr;
};
 
int main()
{
	struct s* ps = (struct s*)malloc(sizeof(struct s));
	ps->n = 100;
	ps->arr = (int*)malloc(40);
	free(ps->arr);
	ps->arr = null;
	free(ps);
	ps = null;
	return 0;
}

C语言中的柔性数组你真的了解吗

通过柔性数组来实现如下:

柔性数组

#include<stdio.h>
struct s
{
	int n;
	int arr[0];//柔性数组
};
int main()
{
	struct s* ps = (struct s*)malloc(sizeof(struct s)+40);
	//使用
	//改变申请的空间
	struct s* tmp= (struct s*)realloc(ps, sizeof(struct s)+80);
	if (tmp == null)
	{
		return;
	}
	if (tmp != null)
	{
		ps = tmp;
	}
	return 0;
}

 

C语言中的柔性数组你真的了解吗

指针动态开辟的缺点

1.此方式会多次进行开辟于释放动态申请的空间,就容易会导致错误

2.容易出现内存碎片

当指针动态开辟的足够多的时候,中间就会出现很多内存碎片,每个内存碎片不连续

就会导致空间的浪费

C语言中的柔性数组你真的了解吗

3.相较于柔性数组,cpu访问的速度要慢一些

cpu访问内存大部分在访问一个空间后,就会访问相邻的空间,就不一次性访问下一个连续的空间,这就会导致,在一定程度上的降速。 

C语言中的柔性数组你真的了解吗

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!