【发布时间】:2016-05-02 17:57:58
【问题描述】:
我正在调查writev 和readv,当我显示内存内容时,我得到了奇怪的数据:
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)。
关于为什么会发生这种事情的任何想法?
【问题讨论】:
-
-Wall是你的朋友——使用它,查看它给出的警告,并尝试理解它们的含义。