C语言 柔性数组的使用详解

 更新时间:2022年03月30日 10:04:31   作者:二球悬铃木丶  
柔性数组(Flexible Array)是引入的一个新特性,它允许你在定义结构体时创建一个空数组,而这个数组的大小可以在程序运行的过程中根据你的需求进行更改特别注意的一点是:这个空数组必须声明为结构体的最后一个成员,并且还要求这样的结构体至少包含一个其他类型的成员

一.柔性数组的特点

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语言 柔性数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现一个简单的SOAP客户端

    C++实现一个简单的SOAP客户端

    这篇文章主要介绍了C++实现一个简单的SOAP客户端,在C++中,一般使用gSOAP来实现客户端、服务端,下面一起进入文章了解具体内容,需要的朋友可以参考一下
    2021-11-11
  • C++实现LeetCode(60.序列排序)

    C++实现LeetCode(60.序列排序)

    这篇文章主要介绍了C++实现LeetCode(60.序列排序),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言动态内存管理介绍

    C语言动态内存管理介绍

    大家好,本篇文章主要讲的是C语言动态内存管理介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • C语言编程实例之输出指定图形问题

    C语言编程实例之输出指定图形问题

    这篇文章主要介绍了C语言编程实例之输出指定图形问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • VS Code远程连接Linux服务器调试C程序的操作方法

    VS Code远程连接Linux服务器调试C程序的操作方法

    这篇文章主要介绍了VS Code远程连接Linux服务器调试C程序的操作方法,打开远程 Linux 服务器上的文件夹本文以 /root/ 为例,给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • OpenCV实现Sobel边缘检测的示例

    OpenCV实现Sobel边缘检测的示例

    本文主要介绍了OpenCV实现Sobel边缘检测的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C++数据结构之文件压缩(哈夫曼树)实例详解

    C++数据结构之文件压缩(哈夫曼树)实例详解

    这篇文章主要介绍了C++数据结构之文件压缩(哈夫曼树)实例详解的相关资料,利用哈夫曼编码的方式对文件进行压缩,并且对压缩文件可以解压,需要的朋友可以参考下
    2017-07-07
  • C语言封装函数字符串练习汇总分享

    C语言封装函数字符串练习汇总分享

    这篇文章主要介绍了C语言封装函数字符串练习汇总分享,分享内容有字符串查找、字符串拼接、字符串转整数等内容,需要而小伙伴可以参考一下
    2022-03-03
  • C++11如何引入的尾置返回类型

    C++11如何引入的尾置返回类型

    C++11 标准引入的尾置返回类型,可以让返回复杂类型的函数声明更加清晰易读,在无法使用C++14 标准的情况下,通过尾置返回类型的语法来推导函数模板的返回类型无疑是最简便的方法,这篇文章主要介绍了C++11引入的尾置返回类型,需要的朋友可以参考下
    2023-01-01
  • C++ Template应用详解

    C++ Template应用详解

    本篇文章主要介绍了C++ Template应用详解,模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。
    2016-12-12

最新评论