跟我学C++中级篇——零长度数组

本文介绍了零长度数组在串口通信、网络通信中的应用,以及如何通过技巧在C/C++中处理不确定长度的数据。它允许动态分配内存,解决了固定数组长度与未知数据长度之间的矛盾,是编程中的实用工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、零长度数组

最初使用零长度数组是在串口通信和网络通信中使用的,它类似于下面的代码:

struct Data
{
  int a;
  char c;
  char buf[0];
};

零长度数组又叫柔性数组,这个非常贴切。它早期是GNU的一个扩展,后来在C99中也进行了支持(-pedantic 禁用扩展),不过在C99中使用时,就不用写那个0了。如果在早期的VC或者其它平台上不支持这种零长度数组的,可以考虑使用一些变通的方式。

二、应用场景

零长度数组主要用来对一些不确定长度的通信负载的内容进行接收。在C/C++的编码过程中,有一个小的技巧,即可以把char*指针强转到结构体的指针,这样就可以直接操作结构体。这对于网络或者串口等通信中有着很强的优势(需要处理一下字节对齐)。

那么有人会问为什么不使用指针呢?或者给一个很长的固定数组。首先,给定一个很长的数组,到底多长是很长?如果能确定最多不过一百个,那么用一百个长度来取代零长度数组可能会更好,但可能跨度很大呢,从几个字节长度到几兆字节长度呢?有人可能说,谁会设计这种协议呢?可有的时候儿协议不是自己设计的,用别人的怎么办?那么这时候儿用零长度指针就非常好用。
那为什么不用指针呢?学习过编译相关知识的都知道,指针指向的地址空间,一般情况下是不会和指针当前的地址连续的,以上面的Data结构体为例,如果创建一个对象,使用零长度数组,所有的字节其实是从变量a依次按顺序向下排列的,是线性的。但如果把buf定义成一个指针,那么buf本身这个地址是排在最后的,但对应的指针指向的空间,则指向了另外一个空间地址。表面上创建了一个Data对象,但其是有两块地址空间被分配,这两块地址空间并不连续。不连续意味着什么?意味着上面提到的将char*强转成指定的结构体指针成为了不可能。因为buf得到的地址空间,未必是原来定义的空间,这个在硬件通信中非常明显。
最好的方法就是,直接传输一大段数据,这些数据是连续的存储在一起的,那么通过强转就可直接进行数据操作,可数据长度又

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值