我在指针端的开源代码中遇到了一个问题,我试图在下面的小片段中复制。
int main()
{
int **a=0x0;
printf ("a = %d Add = %d\n", a, a+75);
return 1;
}
期望是获得75 / 0x4B但是这个代码在32位中提供300,在64位机器中提供600。
输出:
a = 0 Add = 600
但是获取增加位置背后的意识形态,即哈希表中的第75位。
所以它应该是
printf ("a = %d Add = %d\n", a, sizeof (a)+75);
但我无法猜出为什么这300或600输出。有人可以指出吗?
我直到内心发生了一些左移:
75 - 1001011
600 - 1001011000.
非常感谢解决方案。提前谢谢。
答案 0 :(得分:2)
指针算术总是使用指向的大小来完成。在您的情况下,a
是指向指向int 的指针,因此单位大小为sizeof(int*)
,在您的情况下似乎为4(32位)。 4 * 75 = 300。
更确切地说,a + 75
将字节偏移sizeof(*a) * 75
(注意a
的解除引用)添加到指针。发生的事情是你实际上在做&a[75]
,即你得到一个指向第75个元素的指针。
在一个稍微相关的说明中,当您使用printf
打印指针时,您应使用格式"%p"
,并将指针转换为void *
。参见例如this printf
(and family) reference
至于32位和64位系统的不同大小,这是可以预期的。 32位系统上的指针通常为32位,而在64位系统上则为64位。
答案 1 :(得分:1)
程序行为未定义:
格式说明符%d对指针类型无效:请改用%p。
指针算法仅在数组的最后一个元素内有效,或者在数组的最后一个元素之后有效,或者超过标量的标量地址。你不能阅读+ 75。
答案 2 :(得分:0)
首先,使用%p
打印指针,使用%zu
打造sizeof
结果。
也就是说,检查a
的类型,它是int **
,这是指针的大小。而且,它取决于平台/编译器。
指针算法遵循数据类型,因此初始指针总是根据LHS数据类型递增。