c/c++语言开发共享C语言 柔性数组的使用详解

一.柔性数组的特点struct s{int x;int a[];};int main(){printf(“%d”, sizeof(s));}这段代码的输出是什么?我们打印结构体s所占空间的大小,这个a

一.柔性数组的特点

  struct s  {  	int x;  	int a[];  };  int main()  {  	printf("%d", sizeof(s));  }

这段代码的输出是什么?

我们打印结构体s所占空间的大小,这个a[]占多少字节呢?

输出结果是4,可一个int类型的x就是4了,a[]去哪了?好奇怪哦。

原来,这是一种柔性数组。

1.结构体中最后一个元素允许是未知大小的数组,这个数组就是柔性数组。

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

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

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

二.柔性数组的使用

1.如何使用柔性数组

包含柔数组成员的结构用malloc函数进行内存的动态分配,

且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

  #define _crt_secure_no_warnings 1  #include<stdio.h>  #include<stdlib.h>     struct s  {  	int x;  	int a[];  };  int main()  {      //为柔性数组a[]开辟了40个字节的空间  	struct s *ps =(struct s*)malloc(sizeof(struct s) + 40);  	if (ps == null)                                    //检查是否为空指针  	{  		perror("ps");  		return 1;  	}  	ps->x = 10;												  	int i = 0;					  	for (i = 0; i < 10; i++)								  	{                                                    		ps->a[i] = i;                                   //数组使用  	}  	for (i = 0; i < 10; i++)  	{  		printf("%d  ",ps->a[i]);                        //数组打印  	}  	//若觉得40不够用,可用realloc扩容  	//如:  	struct s* ptr = (struct s*)realloc(ps, sizeof(struct s) + 80);  	if (ptr == null)                                    //检查是否为空指针  	{  		perror("realloc");  		return 1;  	}  	else  	{  		ps = ptr;  	}     	free(ps);                                            //释放内存并置为空指针  	ps = null;  }

2.不用柔性数组的话有什么代替

我们经常用字符串指针来申请空间,

那我们直接给字符串指针malloc一块空间,不就行了吗,

为什么还要用柔性数组呢?

  #define _crt_secure_no_warnings 1  #include<stdio.h>  #include<stdlib.h>     struct s  {  	int x;  	int *a;  };  int main()  {  	struct s* ps = (struct s*)malloc(sizeof(struct s) );//为结构体变量x开辟空间  	if (ps == null)  	{  		return 1;  	}  	ps->a = (int*)malloc(40);							//为字符串指针开辟40个字节的空间  	if (ps->a == null)  	{  		free(ps);  		ps = null;  		return 1;  	}  	free(ps->a);  	ps->a = null;     	free(ps);  	ps = null;  }

上述代码确实可以完成相同的功能,

但是柔性数组相对而言更好。

让我们来看看柔性数组的优势。

三.柔性数组的优势

1.方便内存释放

  • 使用柔性数组我们只用free一次,
  • 而使用字符串指针要free两次,有内存泄漏的风险

2.提高访问速度

  • 柔性数组malloc了一次,是连续的内存,
  • 有益于提高访问速度,减少内存碎片。

到此这篇关于c语言 柔性数组的使用详解的文章就介绍到这了,更多相关c语言 柔性数组内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享C语言 柔性数组的使用详解,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/1072617.html

(0)
上一篇 2022年4月6日
下一篇 2022年4月6日

精彩推荐