目录:
1、什么是柔性数组
2、柔性数组的特点
3、柔性数组的使用
4、为什么要有柔性数组
正文:
1、什么是柔性数组
柔性数组(也称为伸缩性数组或柔性数组成员)是C99标准中引入的一种数据结构特性,允许在结构体的最后一个元素处声明一个未知大小的数组。这种特性为在结构体中高效地存储动态大小的数组提供了便利。
声明柔性数组的两种写法:
这两种写法都可,如果第二种写法报错的话,建议换第一种试试。
为什么必须是结构体的最后一个元素才才能声明柔性数组呢?这就需要我们了解一下柔性数组的特点。
2、柔性数组的特点
1、位置限制:结构体中的柔性数组成员前面必须至少包含一个其他类型的成员。这是因为柔性数组的大小是未知的,所以需要一个已知大小的成员来确定结构体的大小。
2、结构体大小计算:当使用sizeof
操作符计算包含柔性数组成员的结构体的大小时,返回的是柔性数组成员的偏移量,而不是整个结构体的大小。因为柔性数组不占结构体的大小,它们的大小是在运行时动态分配的。
ps: 关于动态分配的基本知识:动态内存管理相关的四种函数-CSDN博客
可以看到,sizeof结构体的大小确没有包含柔性数组的内存。
ps:关于如何计算结构体的大小:结构体的内存对齐-CSDN博客
3、内存分配:包含柔性数组成员的结构体需要使用malloc()函数进行动态内存分配。分配的内存大小应大于结构体的大小,以适应柔性数组的预期大小。
4、高效利用内存:使用柔性数组可以避免在结构体中使用指针成员导致的内存碎片化问题。因为柔性数组是结构体的直接成员,所以它们的内存是连续的。
内存的碎片化:
3、柔性数组的使用
4、为什么要有柔性数组
实际上,我们不用柔性数组也能解决问题:
柔性数组还有如此多的限制:结构体中的柔性数组成员前面必须至少包含一个其他类型的成员、需要动态分配和释放内存等,那为什么还要使用柔性数组呢?
因为它的好处也有很多:
1、在访问数组内容时,不需要间接访问,避免了两次访存,提高了效率。
在上面我们不用柔性数组解决问题的时候,我们使用指针data间接的开辟内存空间,最后释放的时候需要free(ps->data)、free(ps)。
如果我们的代码是在⼀个给别⼈⽤的函数中,你在⾥⾯做了⼆次内存分配,并把整个结构体返回给用户。用户调⽤free可以释放结构体,但是⽤⼾并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存⼀次性分配好了,并返回给用户⼀个结构体指针,用户做⼀次free就可以把所有的内存也给释放掉。
2、连续的内存有益于提高访问速度,也有益于减少内存碎片。
这在上面提到过,因为柔性数组是结构体的直接成员,所以它们的内存是连续的。连续的空间自然会减少内存碎片。