- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在研究 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
)。
关于为什么会发生这种事情有什么想法吗?
最佳答案
这与 readv()
和 writev()
函数几乎没有关系,它只与 struct iovec
相关> 他们都使用的类型。
您必须始终确保传递给 printf()
的格式字符串中的转换规范正确匹配同一调用中传递的其余参数的类型。你没有这样做。 %x
字段描述符要求相应的参数是适当宽度的无符号整数类型(#
标志不会改变这一点)。您的实际参数是 struct iovec *
、struct iovec
、void **
、void *
、一个 size_t *
和一个 size_t
。 没有一个对于给定的字段类型是正确的,除了如果 size_t
与 int
的宽度相同(通常不是)。
根据标准,“如果任何参数不是相应转换规范的正确类型,则行为未定义”(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/
正在尝试创建一个 python 包。似乎有效,但我收到警告。我的 setup.py 是: #! /usr/bin/env python from distutils.core import setup
我导入了一个数据类型 X ,定义为 data X a = X a 在本地,我定义了一个通用量化的数据类型,Y type Y = forall a. X a 现在我需要定义两个函数, toY 和 fro
我似乎无法让编译器让我包装 Tokio AsyncRead: use std::io::Result; use core::pin::Pin; use core::task::{Context, Po
我有两个函数“a”和“b”。当用户上传文件时,“b”被调用。 “b”重命名文件并返回新文件名。之后应该编辑该文件。像这样: def a(): edits file def b(): r
我使用 Entity Framework 作为我的 ORM,我的每个类都实现了一个接口(interface),该接口(interface)基本上表示表结构(每个字段一个只读属性)。这些接口(inter
有没有办法打开一个程序,通常会打开一个新的jframe,进入一个现有的jframe? 这里是解释,我下载了一个java游戏,其中一个是反射游戏,它在一个jframe中打开,框架内有一堆子面板,我想要做
我想要下面的布局 | AA BBBBBBB | 除非没有足够的空间,在这种情况下 | AA | | BBBBBBB | 在这种情况下,A 是复选框,B 是复选框旁边的 Text
我正在尝试以不同的方式包装我的网站,以便将背景分为 2 部分。灰色部分是主要背景,还有白色部分,它较小并包装主要内容。 基本上我想要this看起来像this . 我不太确定如何添加图像来创建阴影效果,
我正在使用 : 读取整数文件 int len = (int)(new File(file).length()); FileInputStream fis = new FileInputStream(f
我使用 maven 和 OpenJDK 1.8 打包了一个 JavaFX 应用程序我的 pom.xml 中的相关部分: maven-assembly-plugin
我正在使用两个不同的 ItemsControl 来生成一个按钮列表。
我有一个情况,有一个变量会很方便,to , 可以是 TimerOutput或 nothing .我有兴趣提供一个采用与 @timeit 相同参数的宏来自 TimerOutputs(例如 @timeit
我正在尝试包装一个名为 content 的 div与另一个具有不同背景的 div。 但是,当将“margin-top”与 content 一起使用时div,似乎包装 DIV 获得了边距顶部而不是 co
文档不清楚,它似乎允许包装 dll 和 csproj 以在 Asp.Net Core 5 应用程序中使用。它是否允许您在 .Net Core 5 网站中使用针对 .Net Framework 4.6
我被要求开发一个层,该层将充当通用总线,而不直接引用 NServiceBus。到目前为止,由于支持不引人注目的消息,这并不太难。除了现在,我被要求为 IHandleMessages 提供我们自己的定义
我正在尝试包装 getServersideProps使用身份验证处理程序函数,但不断收到此错误:TypeError: getServerSideProps is not a function我的包装看
我有一个项目,它在特定位置(不是/src/resources)包含资源(模板文件)。我希望在运行 package-bin 时将这些资源打包。 我看到了 package-options 和 packag
我正在寻找打印从一系列对象中绘制的 div。我可以通过使用下面的管道语法来实现这一点。 each i, key in faq if (key == 0) |
我在 Meteor.js“main.js - Server”中有这个方法。 Meteor.methods({ messageSent: function (message) { var a
我注意到,如果我的自定义Polymer 1.x元素的宽度比纸张输入元素上的验证错误消息的宽度窄,那么错误将超出自定义元素的右边界。参见下图: 有没有一种机制可以防止溢出,例如在到达自定义元素的边界时自
我是一名优秀的程序员,十分优秀!