|
发表于 2020-10-17 00:18:29
|
显示全部楼层
我编写了一个小程序(如下),从运行的结果来看,&array + 1 超出了数组的范围(如图),楼上发出的那个链接的文章中认为 “ &array + 1 不是首地址 + 1,系统会认为加了一个 array 数组,偏移了整个数组 array 的大小(也就是 10 个 int 的大小)。所以 int *p = (int*)(&a + 1),其实 p 实际是 &(array[10]),也就是 array + 10。
程序的运行输出情况来看也证实了这一点:&array 是数组指针,其类型为 int(*)[10];(指向含有 10 个 int 的数组), array 是长度为 10 的 int 数组指针,长度为 10 * sizeof(int) = 40 字节,而 &array +1 的地址正好是 *p +9 的 4 个字节之后的地址,所以,&array + 1 实际似乎是 array 数组第 11个元素的地址,但是 array 的第 11 个元素是不存在的。因此,&array + 1 是下一个对象的地址,从而可以将第 11 个地址假想为 array 数组还有第二个数组,当然其数组名可以是 array,也可以是其他的数组名。
- #include <stdio.h>
- int main()
- {
- int *p,array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
- p = array;
- printf("%p\n", (p + 0));
- printf("%p\n", (p + 1));
- printf("%p\n", (p + 2));
- printf("%p\n", (p + 3));
- printf("%p\n", (p + 4));
- printf("%p\n", (p + 5));
- printf("%p\n", (p + 6));
- printf("%p\n", (p + 7));
- printf("%p\n", (p + 8));
- printf("%p\n", (p + 9));
- printf("%p\n", &array + 1);
- return 0;
- }
复制代码
|
|