gpt4 book ai didi

c - 指针相等是否意味着整数相等?

转载 作者:太空狗 更新时间:2023-10-29 17:18:59 24 4
gpt4 key购买 nike

对于 int *a, int *ba == 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 被评估为指针 ab 时,编译器通过只比较 24 位的地址。因此,如果 ab 指向同一个对象 a == b 将为真,但是 (intptr_t) a == (intptr_t) b 由于忽略了高位,因此可能评估为 false。 (请注意,严格来说,ab 应该是指向 void 的指针,或者应该转换为指向 void 的指针在转换为 intptr_t 之前。)

另一个例子是使用一些基址和偏移寻址的系统。在这个系统中,一个指针可能由指定一些基地址的 16 位和指定偏移量的 16 位组成。 base 可能是 64 字节的倍数,所以 baseoffset 表示的实际地址是 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/

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