【发布时间】:2015-06-23 21:23:19
【问题描述】:
我遇到了一个我无法理解的输出代码。代码是-
int main()
{
int a[] = {1, 2, 3, 4, 5, 6};
int *ptr = (int*)(&a+1);
printf("%d ", *(ptr-1) );
return 0;
}
上面代码的输出是6,但我认为应该是1。请解释为什么是6。
【问题讨论】:
-
整数是 2 个字节。
&a+1只是在内存地址中向前移动一个字节......它应该是&a + sizeof(int),基本上。 -
这在技术上是未定义的行为,因为您从不兼容的指针进行转换,应该是
int *ptr = *(&a+1); -
@MarcB 不,这将指向出界。
-
@MarcB:
int终于 16位。然而,它可以更多。对于典型的 32 位 CPU,大多数时候是 32 位(4 个八位字节)。
标签: c arrays pointers pointer-arithmetic