首页 > 解决方案 > iovec 的 iov_len 字段是否定义明确?

问题描述

根据C 中 void 指针的指针算术,不允许使用 void 指针进行算术。然而,iovec结构看起来像这样:

struct iovec {
    void *iov_base;
    size_t iov_len;
};

这是在POSIX 标准中定义的,并且该iov_len字段被描述为有点模糊的“ iov_base指向的内存大小”。由于iovec只是一个数据结构,我想知道接受它作为输入参数的函数是否定义了它们如何使用该iov_len字段,但两者都定义了,readv并且writev再次模糊地描述为“内存区域的长度”。

对于某些函数,iov_len字段的含义似乎是明确定义的。例如,recvmsg规范说“ iov_len字段以字节为单位给出 [存储区域] 的大小”。此外,recv接受 void 指针和长度的 ,正确地将长度参数定义为缓冲区的长度(以字节为单位)。

我的问题:在iov_len定义为缓冲区长度的这些情况下,字段的含义是否明确?

标签: cposixstandards

解决方案


我相信你只是在这里想多了。这里的“大小”绝对意味着“以字节为单位的大小”,在您提到的情况下,我认为“大小”和“长度”这两个词之间没有任何有意义的区别。你没有错过任何微妙之处。

他们没有像在许多其他地方那样说“以字节为单位”可能有点草率,如果你真的想要,你可以提交一份缺陷报告,但我认为没有太大的混淆空间,因为真的没有其他合理的解释。

没有人声称它void有大小,但它通常void *用作指向大小以字节计的通用缓冲区的指针;使用void *而不是unsigned char *使您可以方便地将指针传递给其他类型而无需强制转换。


推荐阅读