在结构体最后定义一个长度为0的字符数组(技巧)

本文介绍了一种使用C语言中的零长度数组来实现灵活大小缓冲区的方法。通过将零长度数组与动态内存分配结合,可以高效地创建可变大小的数据缓冲区。

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

转载请加注:Qdieyou

定义一个结构体如下:
typedef struct buffer_s {
    int    a;
    int    buffer_no;
    int    flags;       
    unsigned char data[0];
} buffer_t;

大家注意到最后那个长度为0的字符数组了吧?不知道你疑惑了没。嘿嘿!!!


这个常用技巧常用来构成缓冲区:
数组名就代表了该结构体后面数据的起始地址(而且无需初始化,不占空间) 而如果用指针的话,我们还要初始化,而且还要占空间(好象是int类型长度的空间)

见程序代码如下:

buffer_t *buf;
int buf_len    /*缓冲区数据的长度*/

/*直接把buffer的结构体跟存放数据的内存一起分配了*/
buf = (buffer_t *) malloc( sizeof(buffer_t) + buf_len);

buf->data = "我就是缓冲中的内容/n";

/*也可以下面这样引用:*/
buf->data = 'a';  /*i的取值范围:0~buf_len-1*/

怎么样?明白几分了?
在结构体中,我们定义了0长度的数组,按理buf->data = 'a';属于越界访问,但是我们把结构体后面的buf_len个长度的空间也一起申请了,所以该访问是合法的!
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值