c语言数组最大长度_(学习笔记)c语言中零长度数组的意义

58276cca5a092ef20045b34a26ca31a1.png

今天在学习linux服务器编程的时候遇到一个很奇怪的写法,大致就是子进程通过struct msghdr这个结构体向父进程传递一个文件描述符,因为没有到msghdr中的iovec*类型的成员,作者直接就把一个零长度数组赋给iovec中的iov_base了......:

void send_fd(int fd, int fd_to_send)
{
    struct iovec iov[1];
    struct msghdr msg;
    char buf[0];

    iov[0].iov_base = buf;
    //...
}

虽然到最后我也没明白为什么不赋NULLiov_base,但是查了查资料发现零长度数组还是有其它用途的:方便缓冲内存管理。考虑下面两个结构体:

// length表示这个数据块长度,data指向数据块起始
struct data_block1
{
    size_t length;
    char data[0];
}
struct data_block2
{
    size_t length;
    char* data;
}

那么创建一个data_block2变量,先要给这个变量分配一次内存

#define DATA_LEN    1024
struct data_block2* data = (struct data_block2*)malloc(sizeof(struct data_block2));
data->data = (char*)malloc(DATA_LEN);

然后再给data这个成员分配块内存

#define DATA_LEN    1024
data->data = (char*)malloc(DATA_LEN);

但是data_block1这个结构体可以一次干完上面两个事情

struct data_block1* data = (struct data_block1*)malloc(sizeof(struct data_block1) + DATA_LEN);

接着就可以用data这个零长度数组来访问这块数据内存了

data->data[1] = '0';

这是因为malloc一次分配的内存是连续的,因此可以用数组索引的方式来访问不属于data_block1结构体的数据内存。在释放这块数据的时候也是只用free一次就好了,而data_block2则要free两次。

这样的写法应该只有gcc编译器不会给你抛warning把。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值