c - 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
定义为缓冲区长度的这些情况下,字段的含义是否明确?
解决方案
我相信你只是在这里想多了。这里的“大小”绝对意味着“以字节为单位的大小”,在您提到的情况下,我认为“大小”和“长度”这两个词之间没有任何有意义的区别。你没有错过任何微妙之处。
他们没有像在许多其他地方那样说“以字节为单位”可能有点草率,如果你真的想要,你可以提交一份缺陷报告,但我认为没有太大的混淆空间,因为真的没有其他合理的解释。
没有人声称它void
有大小,但它通常void *
用作指向大小以字节计的通用缓冲区的指针;使用void *
而不是unsigned char *
使您可以方便地将指针传递给其他类型而无需强制转换。
推荐阅读
- parameters - 为什么 Dialogflow 不从履行响应中检索参数值?
- postman - 如何验证组件模式中的嵌套属性(Postman 中的 openapi 3)
- angular - 具有多个系列 Highcharts 的堆叠列中的分段重叠问题
- eloquent - 雄辩的选择项目,在同一关系列上有几个 where 子句
- c++ - 谁能告诉为什么这段代码会产生错误的输出?
- java - 当每个模块都有特定版本时,如何在 Nexus 中将工件关联到一个业务版本?
- java - 使用 letencrypt 证书在 Wildfly 19 上设置 ssl 证书
- ios - 没有这样的文件或目录,但文件存在 Xcode
- angular - 如何将 Angular 表单数据转换为服务器将接受的 POST 请求?
- angular - 不能使用角材料的选择