什么叫变长结构体?
其实真正意义上并不是结构体的大小可变,而是使用结构体中的变量代表一个地址,从而访问超出结构体大小范围的数据。
struct Var_Len_Struct
{
int nsize;
char buffer[0];
};
那结构体是怎么实现可变长的呢?如上所示,请注意看结构体中的最后一个元素,一个没有元素的数组。我们可以通过动态开辟一个比结构体大的空间,然后让buffer去指向那些额外的空间,这样就可以实现可变长的结构体了。更为巧妙的是,我们甚至可以用nsize存储字符串buffer的长度。
变长结构体的好处体现在哪?
引出部分如果说定义定长数组浪费空间,定义一个指针不也能指向变长的数据域部分吗?
是的,是可以实现的。那么我们就对比下有什么不同。
<1> 存储大小方面:指针的方式需要多开辟存储空间。
<2> 数据连续存储方面:指针明显数据域是单独开辟的空间,与前的nsize不在连续的存储区域,而数组则在连续的存储空间下。
<3>释放内存方面:显然指针的方式,需要先释放数据域部分,才能释放指向结构体的指针变量;而数组可以直接释放。
总结如下:
-
结构体最后使用0或1的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直接使用指针而不使用数组,那么,你在分配内存缓冲区时,就必须分配结构体一次,然后再分配结构体内的指针一次,(而此时分配的内存已经与结构体的内存不连续了,所以要分别管理即申请和释放)。
-
而如果使用数组,那么只需要一次就可以全部分配出来,反过来,释放时也是一样,使用数组,一次释放,使用指针,得先释放结构体内的指针,再释放结构体。还不能颠倒次序。
-
其实变长结构体就是分配一段连续的的内存,减少内存的碎片化,简化内存的管理。
变长结构体的应用
<1>Socket通信数据包的传输;
<2>解析数据包,如笔者遇到的问题。
<3>其他可以节省空间,连续存储的地方等。
变长结构体并非结构体大小可变,而是通过结构体中未指定长度的数组来访问额外数据。其好处包括内存管理的便利性和减少碎片化。应用包括Socket通信数据包传输、数据包解析等场景。
2427

被折叠的 条评论
为什么被折叠?



