【发布时间】:2019-08-30 21:10:54
【问题描述】:
这是 C 代码。
int main() {
int i = 10, *p = &i;
printf("%ld", p - (int *) NULL);
}
对于指针算术部分,'gcc' 和 'clang' 在它们的汇编输出中生成一个 'sar rax, 2' 指令。有人可以解释一下这种情况下的指针算术与算术右移有何关系。
【问题讨论】:
-
您的代码调用了 UB。 2个指针的区别must be printed with
%zd -
@phuclv: 不完全是:
ptrdiff_t的printf格式为%td、size_t和ptrdiff_t通常大小相同且符号不同,但C 不保证标准。将差异转换为(long)(p - (int *)NULL)会产生已定义的代码,但可能会产生与printf("%lld", (long long)(p - (int *)NULL));不同的结果,例如在 64 位 Windows 上。 -
请注意,两个不引用同一数组(或该数组末尾的指针)的指针相减也是未定义的行为。每6.5.6 Additive operators, paragraph 9 of the C standard:“当减去两个指针时,都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素之后的元素。...”
标签: c pointers null-pointer