柔性数组理解

简介: 柔性数组理解

柔性概念


零长度数组(Arrays of Length Zero)也叫做可变数组/柔性数组。 在c99中,对于结构体中的最后一个成员,可以允许最后一个成员是未知大小的数组,这样的数组就叫做柔性数组。


定义


struct udppkt {
    struct ethhdr et;
    struct iphdr ip;
    struct udphdr udp;
    unsigned char data[0];//定义零长数组或柔性数组,1.不需要具体的长度。2.不考虑越界
}
或者
struct udppkt {
    struct ethhdr et;
    struct iphdr ip;
    struct udphdr udp;
    unsigned char data[];//定义零长数组或柔性数组,1.不需要具体的长度。2.不考虑越界
}


特点


特点: 1> 定义的结构体中的柔性数组成员前面必须至少含有一个别的类型的成员;一般柔性数组放到结构体最后;

2>结构体长度,sizeof返回的结构体的大小不包含柔性数组的大小;柔性数组长度为0;

3>包含柔性数组成员的结构体的大小用malloc函数动态分配内存,并且分配的内存大小应该大于结构体的大小,以适应柔性数组的预期大小。

4> 对于长度为0数组, 在申请内存空间时, 采用一次性分配的原则进行;


用途 : 长度为0的数组的主要用途是为了满足需要变长度的结构体


用法 : 在一个结构体的最后, 申明一个长度为0的数组, 就可以使得这个结构体是可变长的. 对于编译器来说, 此时长度为0的数组并不占用空间, 因为数组名本身不占空间, 它只是一个偏移量, 数组名这个符号本身代表了一个不可修改的地址常量。


性能


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

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

也给释放掉。

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

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


参考


C语言0长度数组(可变数组/柔性数组)详解

柔性数组的使用

目录
相关文章
|
10月前
|
编译器 C语言 Python
柔性数组
柔性数组
33 0
|
11月前
|
编译器
动态内存管理与柔性数组 1
动态内存管理与柔性数组
44 0
|
11月前
|
程序员 C语言 C++
动态内存管理与柔性数组2
动态内存管理与柔性数组
41 0
|
编译器 C语言 C++
动态内存分配(3)——柔性数组
动态内存分配(3)——柔性数组
|
4月前
|
编译器
关于柔性数组
关于柔性数组
|
4月前
|
编译器 C语言
|
10月前
|
编译器 C语言
认识柔性数组
认识柔性数组
|
存储 算法 程序员
【C/C++】动态内存&柔性数组
【C/C++】动态内存&柔性数组
89 0
|
编译器 C语言
常见的动态内存的错误 和 柔性数组
✅<1>主页:C语言的前男友 📃<2>知识讲解:常见的动态内存的错误,以及柔性数组(C99) 🔥<3>创作者:C语言的前男友 ☂️<4>开发环境:Visual Studio 2022 💬<5>前言:之前我们说过动态内存管理的知识,今天我们来见识一下,动态内存管理常见的错误。帮助大家对动态内存管理有更深入的理解。
|
编译器 C语言
带你认识柔性数组
小编今天又给大家带来新东西了,相信柔性数组这个名词对于大部分人都比较陌生,那接下来就让我们去认识认识这个新朋友
64 0