其他分享
首页 > 其他分享> > C语言0长度数组(可变数组/柔性数组)

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

作者:互联网

一、零长度数组概念

  众所周知, GNU/GCC 在标准的 C/C++ 基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero) 就是其中一个知名的扩展,多数情况下, 其应用在变长数组中, 其定义如下

struct Packet
{
    int state;
    int len;
    char cData[0]; //这里的0长结构体就为变长结构体提供了非常好的支持
};

首先对 0长度数组, 也叫柔性数组 做一个解释 :

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

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

二、 0长度数组的用途

  我们设想这样一个场景, 我们在网络通信过程中使用的数据缓冲区, 缓冲区包括一个len字段和data字段, 分别标识数据的长度和传输的数据, 我们常见的有几种设计思路。

 

  我们从实际场景中应用的设计来考虑他们的优劣. 主要考虑的有, 缓冲区空间的开辟, 释放和访问。

 1 定长包(开辟空间, 释放, 访问)

  比如我要发送 1024 字节的数据, 如果用定长包, 假设定长包的长度 MAX_LENGTH 为 2048, 就会浪费 1024 个字节的空间, 也会造成不必要的流量浪费.

  (1)数据结构定义

//  定长缓冲区
struct max_buffer
{
    int     len;
    char    data[MAX_LENGTH];
};

  (2)数据结构大小

    考虑对齐, 那么数据结构的大小 >= sizeof(int) + sizeof(char) * MAX_LENGTH

 

标签:MAX,C语言,LENGTH,数组,长度,缓冲区,柔性,数据
来源: https://www.cnblogs.com/zwj-199306231519/p/15334605.html