认识柔性数组

在C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员

限制条件是:

  1. 结构体中
  2. 最后一个成员
  3. 未知大小的数组

1.柔性数组的形式

那么我们怎样写一个柔性数组呢

cs 复制代码
typedef struct st_type
{
    int i;
    int a[0];//柔性数组成员
}type_a;

有些编译器会报错无法编译,可以改成:

cs 复制代码
typedef struct st_type
{
    int i;
    int a[];//柔性数组成员
}type_a;

2.柔性数组的特点

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

例如:

cs 复制代码
typedef struct st_type
{
	int i;
	int a[0];//柔性数组成员
}type_a;
printf("%d\n", sizeof(type_a));//输出结果是4

3.柔性数组的优势

第一个好处是:方便内存释放

如果我们的代码是在一个给别人用的函数中,在里面做了二次内存分配并把整个结构体返回给用户,用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以我们把结构体的内存及其成员需要的内存一次性分配好,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存释放掉

第二个好处是:有利于访问速度

连续的内存有益于提高访问速度,也有益于减少内存碎片

相关推荐
Code_Solitude11 小时前
传智杯备赛代码整理(前4题)
数据结构·算法
Jasmine_llq11 小时前
《P8816 [CSP-J 2022] 上升点列》
数据结构·算法·贪心·排序·二维动态规划 dp·类背包状态转移
辛苦才能12 小时前
C++ 哈希表深度解析:删除为什么必须打标记,负载因子为什么卡 0.7
开发语言·数据结构·c++·算法
JasmineX-112 小时前
数据结构(笔记)——顺序栈
c语言·数据结构·笔记
凉茶钱14 小时前
list:哨兵节点,const_iterator 和 const iterator的区别与迭代器失效
数据结构·c++·list
敲代码的苦1315 小时前
头歌数据结构-排序的实现及其应用
数据结构
有同事要进步16 小时前
Leecode第68题:x的平方根
java·数据结构·算法
Pniubi16 小时前
HashMap扩容全流程
java·开发语言·数据结构
by209992 天前
哈希表——快速找到数据:冲突、删除与扩容的实现
数据结构·c++·哈希算法·散列表
Code_Solitude2 天前
c语言:关于qsoet函数知识点
c语言·数据结构·算法