gpt4 book ai didi

c - iov(writev)中的奇怪包装?

转载 作者:太空宇宙 更新时间:2023-11-04 04:30:25 27 4
gpt4 key购买 nike

我正在研究 writevreadv,当我显示内存内容时,我得到了奇怪的数据:

struct iovec *iov = malloc(sizeof(struct iovec) * 3);
iov[0].iov_base = test_string1;
iov[0].iov_len = strlen(test_string1);
printf("test1: IOV: &%#x, IOV: %#x, IOV_BASE: &%#x, IOV_BASE: %#x IOV_LEN: &%#x IOV_LEN: %#x\n",
&iov[0], iov[0], &iov[0].iov_base, iov[0].iov_base, &iov[0].iov_len, iov[0].iov_len);

我期待:

  • IOV& 放置IOV
  • 的位置
  • IOV 将存储的值。
  • IOV_BASE& 应该放IOV_BASE的位置
  • IOV_BASE 应该放在test_string1
  • 的位置
  • IOV_LEN& 应该放IOV_LEN的位置
  • IOV_LEN 应该放test_string1
  • 的长度

但是,当运行它时,我得到了这些结果:

test1: IOV: &0x603010, IOV: 0x400d34, IOV_BASE: &0xe, IOV_BASE: 0x603010 IOV_LEN: &0x400d34 IOV_LEN: 0x603018

现在,当在 gdb 中打印 iov[0] 时,我得到这些值:

(gdb) print iov[0]
$1 = {
iov_base = 0x400d34,
iov_len = 14
}

真正奇怪的是iov_len。根据 gdb,test_string1 的长度为 14 个字符(实际上是这样);然而,程序说它的长度是 6303768(十进制)。该程序确实输出了正确的长度值,但它不在正确的位置 (IOV_BASE)。

关于为什么会发生这种事情有什么想法吗?

最佳答案

这与 readv()writev() 函数几乎没有关系,它只与 struct iovec 相关> 他们都使用的类型。

您必须始终确保传递给 printf() 的格式字符串中的转换规范正确匹配同一调用中传递的其余参数的类型。你没有这样做。 %x 字段描述符要求相应的参数是适当宽度的无符号整数类型(# 标志不会改变这一点)。您的实际参数是 struct iovec *struct iovecvoid **void *、一个 size_t * 和一个 size_t没有一个对于给定的字段类型是正确的,除了如果 size_tint 的宽度相同(通常不是)。

根据标准,“如果任何参数不是相应转换规范的正确类型,则行为未定义”(C2011、7.21.6.1/9、7.21.6.3/2)。这适用于您的通话。过度思考或试图解释未定义的行为并不是很有用,因为它是未定义的。

我不确定我是否遵循了您预期的行为,尤其是关于 iov[0]。那是一个结构struct 没有转换说明符,并且您碰巧获得的任何转换——如果程序没有简单地崩溃——很可能是您的特定 C 实现的特殊性,也许是您的程序的特殊性,甚至可能是月相(参见“未定义的行为”)。

您可以尝试打印有关您的struct iovec 的详细信息:

printf("test1: IOV &: %p, IOV_BASE &: %p, IOV_BASE: %p, IOV_LEN &: %p, IOV_LEN: %#zx\n",
(void *) &iov[0], (void *) &iov[0].iov_base, iov[0].iov_base,
(void *) &iov[0].iov_len, iov[0].iov_len);

%p 转换说明符用于打印指针(指向void)。最后一个转换说明符中的 z 宽度说明符表示参数是 size_t 的宽度(事实上,该参数恰好是 size_t)。您不能打印 struct 本身,所以我省略了它。我插入了转换以将指针参数转换为 void * 类型。所有指针都可以转换为这种类型而不会丢失信息,具体是 void * 必须对应一个 %p 说明符。

关于c - iov(writev)中的奇怪包装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36988645/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com