- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
对于 int *a, int *b
,a == b
是否意味着 (intptr_t)a == (intptr_t)b
?我知道例如在现代 X86 CPU 上确实如此,但是 C 标准或 POSIX 或任何其他标准是否对此提供保证?
最佳答案
C 标准不保证这一点。 (此答案未说明 POSIX 或其他标准是否对 intptr_t
进行了说明。)C 标准(2011 年,N1570 草案)对 intptr_t
的说明是:
7.20.1.4 1 The following type designates a signed integer type with the property that any valid pointer to void can be converted to this type, then converted back to pointer to void, and the result will compare equal to the original pointer: intptr_t
作为一个理论证明,一个反例是一个具有 24 位地址的系统,其中高八位未被使用,但可用的整数类型有 8 位、16 位和 32 位。在这种情况下,C 实现可以使 intptr_t
成为 32 位整数,并且可以通过将 24 位地址复制到 32 位地址来将指针转换为 intptr_t
整数并忽略高八位。这些位可能是以前存在的任何东西遗留下来的。当 intptr_t
值转换回指针时,编译器会丢弃高八位,从而得到原始地址。在这个系统中,当 a == b
被评估为指针 a
和 b
时,编译器通过只比较 24 位的地址。因此,如果 a
和 b
指向同一个对象 a == b
将为真,但是 (intptr_t) a == (intptr_t) b
由于忽略了高位,因此可能评估为 false。 (请注意,严格来说,a
和 b
应该是指向 void
的指针,或者应该转换为指向 void
的指针在转换为 intptr_t
之前。)
另一个例子是使用一些基址和偏移寻址的系统。在这个系统中,一个指针可能由指定一些基地址的 16 位和指定偏移量的 16 位组成。 base 可能是 64 字节的倍数,所以 base 和 offset 表示的实际地址是 base•64 + offset。在这个系统中,如果指针 a
的基数为 2,偏移量为 10,则它表示的地址与指针 b
的基数为 1,偏移量为 74 相同。当比较指针时,编译器会为每个指针评估 base•64 + offset 并比较结果,因此 a == b
评估为 true。但是,当转换为 intptr_t
时,编译器可能会简单地复制这些位,从而为 (intptr_t) a
生成 131,082 (2•65536 + 10) 和 65,610 (1•65536 + 74) 用于 (intptr_t) b
。然后 (intptr_t) a == (intptr_t) b
的计算结果为 false。但是,将 intptr_t
转换回指针类型会产生原始指针的规则仍然成立,因为编译器将简单地再次复制这些位。
关于c - 指针相等是否意味着整数相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50726231/
我在 OS X 中构建菜单栏项时找到了一些示例代码。它使用了单个 |我不确定它的实际含义。 (我想做的是在菜单项左键单击时调用一个函数,但在右键单击时显示菜单) 这是我的代码 //Get refere
为什么它在第 23 行抛出编译错误。'a' 是 Apple 类的对象,col 是包含 Apple 对象的列表,但它仍然是抛出下面提到的编译错误: 类型 Collection 中的方法 add(capt
我有一个类A,它扩展了抽象类B。 让B有一个 protected 字段值 我想在 A 中使用这个字段。如果 A 没有 value,我可以编写 this.value 从 B 获取它。 与super.va
DBLint 用于检查数据库状态。有46条规则。在 www.dblint.org 上对每条规则都有一些简单的解释,但对规则 31 的描述如下: 定义的主键不是最小键:主键是最小的 super 键。如果
var aa: (()?) = (john.residence?.address = someAddress) var bb: ()? = john.residence?.printNumberOfR
我对 jquery 的可重用插件有点陌生。我已经多次遇到这段代码,但无法弄清楚究竟发生了什么。 (function( $ ){ ... })( jQuery ); 谁能帮我解答一下吗? 最佳答案
这个问题已经有答案了: int foo (int argc, ...) vs int foo() vs int foo(void) in C (4 个回答) 已关闭 9 年前。 所以我最近在 Hack
typedef struct Element { struct Element *next; void *data; } Element; 在 pop 函数中,(!(elem = *s
数据加载两次...意味着 AsyncTask onPostExecute 加载相同的数据两次?我的 AsyncTask onPostExecute 运行两次它加载相同的数据...我正在运行异步任务以从
运行“yomeanjs”时,我无限期地挂起“这可能需要几分钟”。当我尝试运行 grunt 时,它失败了,与 npm start 相同。 我使用的是 Win 8.1,并安装了最新的 Node 和 Mon
我正在看 big nerd ranch 的“Android Programming”中的这个页面,我对下面的句子感到困惑。它声明“当 Activity 被隐藏时, Activity 对象不存在”。这让
是否 const vector意味着它的元素是const也一样? 在下面的代码中, v[0].set (1234);在 void g ( const vector & v )产生编译器错误 const
我是 xml 相关事物的新手 我无法理解: SelectNodes(@"//Form/*[. = 'on']"); 注:SelectNodes是 XmlNode 的函数.(与 XmlDocument
我想方便地控制命令行参数。因此我想使用 ShellLib。 我的代码是这样的: ... #include ... EFI_STATUS EFIAPI UefiMain ( EFI_HANDL
着眼于更正 Debian 上/etc/init.d/hostapd 中的一个问题。但是,我不知道这行代码是做什么的,也不知道它是如何工作的 [ -n "$DAEMON_CONF" ] || exit
有没有人遇到过类似我下图所示的情况? 我有一个变量 landingBools.didSlowPast40Knots(正如您从调试打印输出中看到的那样)为假,但出于某种原因,if 语句评估为真。 知道为
我设法使用 flexbox 和一些非常基本的 JavaScript 为自己构建了三个下拉菜单。 因为我不太了解,所以我使用了一个简单的函数三次,而不是使用参数、变量和其他东西。我将其称为丑陋的“蛮力”
这周刚开始学习 javascript。我有一个非常菜鸟的问题。 exports.displayName = (undefined: ?string); 在 React Native 中意味着什么? 这
我正在阅读有关 NaN here 的内容它说: A comparison with a NaN always returns an unordered result even when compari
编码格式:引入*表示“从头开始重复”。例子。输入-{a,b,a,b,c,a,b,a,b,c,d}可以写成{a,b,*,c,*,d}。输出:5;例如2:ABCABCE,输出- 5。 这里*表示从头开始重
我是一名优秀的程序员,十分优秀!