柔性数组(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语言 柔性数组的使用详解


- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- Easyx实现扫雷游戏 2023-02-06
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- ubuntu下C/C++获取剩余内存 2023-09-18
- Qt计时器使用方法详解 2023-05-30
- C++ 数据结构超详细讲解顺序表 2023-03-25
- C语言详解float类型在内存中的存储方式 2023-03-27
- C语言qsort()函数的使用方法详解 2023-04-26
- C语言手把手带你掌握带头双向循环链表 2023-04-03