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

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

  • 何为柔型数组
    • 柔型数组的特点与使用
  • 柔型数组的优势

何为柔型数组

也许你从来没有听说过柔性数组(Flexible Array)这个概念,但是它确实是存在的。
C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。
柔性数组(Flexible Array)是引入的一个新特性,它允许你在定义结构体时创建一个空数组,而这个数组的大小可以在程序运行的过程中根据你的需求进行更改,特别注意的一点是:这个空数组必须声明为结构体的最后一个成员,并且还要求这样的结构体至少包含一个其他类型的成员。
比如:

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

上述代码中,数组a就是一个柔型数组,它符合了为空数组,且为结构中的最后一个元素,需要提醒的是,空数组的写法不止有 a[0] 这种写法,下面这种a[] 的写法也是可以的,具体用哪种可以看自己使用的编译器支持哪种。

typedef struct st_type
{
   
 int i;
 int a[];
}type_a;

柔型数组的特点与使用

我们先来看看这段代码:

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

这段代码的输出是什么?我们打印结构体S所占空间的大小,可是柔型数组,也就是这个a[]占多少字节呢?
C语言 柔性数组的使用详解_第1张图片
最终的输出结果是4个字节,换句话说就是,这份柔型数组a[]似乎并没有计算到结构体的大小中,那么是不是柔型数组是不占用内存的呢?这时候我们就需要谈及柔型数组的特点了。

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

而柔型数组相当于在一个结构体的最后 ,申明一个长度为空的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量, 数组名这个符号本身代表了一个不可修改的地址常量,但它的大小是可以随意变化的。
一言以蔽之,就是包含柔数组成员的结构,是需要用malloc函数进行

你可能感兴趣的:(c语言,柔性数组,数据结构,c++,算法)