我正在尝试使用gcc编译器执行以下C程序.
#include <stdio.h>
int main()
{
int *a[] = {1,2,3,4,5,6};
printf("\narr0=%d\n", *a);
printf("arr1=%d\n", *(a+1));
printf("arr2=%d\n", *a+2);
printf("arr3=%d\n", *a+3);
printf("arr4=%d\n", *a+4);
return 0;
}
Output:-
arr0=1
arr1=2
arr2=9
arr3=13
arr4=17
Run Code Online (Sandbox Code Playgroud)
当我跳过*a + 2,*a + 3,*a + 4的括号时,我无法理解发生了什么.对于*a + 2,它操纵为:
= *a+2
= *a+(4*2) 4 ->Size of int
= 1+(8)
So, *a+2 = 9
Run Code Online (Sandbox Code Playgroud)
与其他人一样.
但我期待输出如下.(?)
arr0=1
arr1=2
arr2=3
arr3=4
arr4=5
Run Code Online (Sandbox Code Playgroud)
我知道,我已经以不太好的方式声明指针数组的方式.
任何人都可以解释这里发生了什么?
您正在声明一堆指向无效地址的指针,因为小整数通常不是有效的整数指针.顺便说一句,您应该收到编译器警告; 在这里发布问题之前阅读这些并修复它们是个好主意.或者至少提一下你会收到警告.
一旦你取消引用任何这些,未定义的行为就会发生.
你永远做不好,所有你做的就是索引数组本身,并使用错误的格式说明符打印指针(你应该使用%p
,而不是%d
).