深入了解一下C语言中的柔性数组

 更新时间:2023年2月15日 09:35  点击:48 作者:Jambo!

什么是柔性数组

柔性数组是在C99中定义的

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

柔性数组的长度可以写成0,也可以不规定数组长度

下面两种写法都是正确的

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

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

  • 结构体中的柔性数组成员前面至少有一个其他成员
  • sizeof返回的这种结构体的大小不包括柔性数组的大小
  • 包含柔性数组成员的结构体用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大
    小,以适应柔性数组的预期大小。

柔性数组的使用

typedef struct S
{
	int i;
	char c[];//c是柔性数组
}S;

int main()
{
	S* p = (S*)malloc(sizeof(S) + 10 * sizeof(char));
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	p->i = 10;
	for (int i = 0; i < 10; i++)
	{
		p->c[i] = 'a';
	}
	free(p);
	p = NULL;
	return 0;
}

在malloc开辟空间时,开辟空间大小为sizeof(S) + 10 * sizeof(char),前面的sizeof(S)其实是表示结构体中int i的大小,后面则是给c开辟了10个字节大小的连续空间

如果觉得前面开辟空间小了,数组c不够长,还可以用realloc函数对内存大小进行调整

int main()
{
	S* p = (S*)malloc(sizeof(S) + 10 * sizeof(char));
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	p->i = 10;
	
	S* ptr = (S*)realloc(p, sizeof(S) + 20 * sizeof(char));
	if (ptr == NULL)
	{
		perror("realloc");
		return 1;
	}
	p = ptr;
	for (int i = 0; i < 20; i++)
	{
		p->c[i] = 'a';
	}

	free(p);
	p = NULL;
	return 0;
}

其实我们也可以写出另一种形式的结构体,它的功能与柔性数组类似

typedef struct S2
{
    it i;
    char* c;
}S2;

对于这个结构体的使用如下:

int main()
{
	S2* p = (S2*)malloc(sizeof(S2));
	p->i = 10;
	p->c = (char*)malloc(10 * sizeof(char));
	for (int i = 0; i < 10; i++)
	{
		p->c[i] = 'a';
	}

	free(p->c);
	p->c = NULL;
	free(p);
	p = NULL;

	return 0;
}

为了使用这个结构体,需要先给结构体开辟一个空间S2* p = (S2*)malloc(sizeof(S2));然后再需要动态开辟一个块空间让c指向

这种写法需要开辟2次内存,同样在最后释放内存是,也需要free2次

所以就可以看出柔性数组的好处:

第 一个是方便内存释放

因为不论是我们在使用时或给别人写一个函数让别人使用时,如果在里面做了二次内存分配,可能别人使用时并不会知道结构体内部还有一个成员需要释放。所以就需要把内存一次性分配好,在最后释放一次内存就可以了

第二个是加快访问

如果二次内存分配,就会在内存中产生一些内存碎片,这样即浪费了空间也不利于访问

到此这篇关于深入了解一下C语言中的柔性数组的文章就介绍到这了,更多相关C语言柔性数组内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

原文出处:https://blog.csdn.net/weixin_64116522/article/details/128982

相关文章

  • C语言实现放烟花的程序

    这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
  • 详解如何将c语言文件打包成exe可执行程序

    这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
  • C语言中求和、计算平均值、方差和标准差的实例

    这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
  • C语言实现从文件读入一个3*3数组,并计算每行的平均值

    今天小编就为大家分享一篇C语言实现从文件读入一个3*3数组,并计算每行的平均值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
  • 详解C语言中const关键字的用法

    这篇文章主要对C语言中const关键字的用法进行了详细的分析介绍,需要的朋友可以参考下...2020-04-25
  • C语言单链表实现多项式相加

    这篇文章主要为大家详细介绍了C语言单链表实现多项式相加,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • C语言简单实现计算字符个数的方法

    这篇文章主要介绍了C语言简单实现计算字符个数的方法,涉及C语言针对字符串的简单遍历与判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-04-25
  • C语言小程序 数组操作示例代码

    对数组进行操作,查找、插入、删除...2020-04-25
  • c实现linux下的数据库备份

    本文给大家简单介绍下c实现linux下的数据库备份的方法和具体的源码,十分的实用,有需要的小伙伴可以参考下。...2020-04-25
  • C语言判断字符串是否以str2开头代码

    这里给大家分享的是一个使用C语言实现的判断字符串中是否以某字符开头或者结尾的代码,非常的简单实用,希望大家能够喜欢...2020-04-25
  • C语言循环结构与时间函数用法实例教程

    这篇文章主要介绍了C语言循环结构与时间函数用法,是C语言中非常重要的一个技巧,需要的朋友可以参考下...2020-04-25
  • C语言/C++如何生成随机数

    这篇文章主要介绍了C语言/C++如何生成随机数,C语言/C++产生随机数主要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数,如何解决?感兴趣的小伙伴们可以参考一下...2020-04-25
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • C语言学生成绩管理系统小设计

    这篇文章主要为大家详细介绍了C语言学生成绩管理系统小设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • C语言中逻辑运算符与条件运算符的学习教程

    这篇文章主要介绍了C语言中逻辑运算符与条件运算符的学习教程,条件运算符问号即三目运算符使用起来十分方便,需要的朋友可以参考下...2020-04-25
  • 一篇文章带你了解C语言:入门基础(2)

    这篇文章主要介绍了C语言入门之基础知识详解,文中有非常详细的C语言使用教程及相关基础知识,对正在学习c语言的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-08-04
  • C语言实现简单的贪吃蛇游戏

    这篇文章主要为大家详细介绍了C语言实现简单的贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-28
  • C语言版五子棋游戏的实现代码

    这篇文章主要为大家详细介绍了C语言版五子棋游戏的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-29
  • C语言实现数字雨效果

    这篇文章主要为大家详细介绍了C语言实现数字雨效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • 简单实现C语言2048游戏

    这篇文章主要为大家详细介绍了简单实现C语言2048游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25