作者:骨头少校_726 | 来源:互联网 | 2023-05-28 19:57
我有以下程序,它定义了2个整数和一个指向整数的指针.
#include
int main() {
int bla=999;
int a=42;
int* pa=&a;
printf("%d \n", *pa);
printf("%d \n", pa);
pa++;
//*pa=666; //runs (no error), but the console is showing nothing at all
printf("%d \n", *pa);
printf("%d \n", pa);
pa++;
//*pa=666; //runs and changes the value of *pa to 666;
printf("%d \n", *pa);
printf("%d \n", pa);
}
输出是:
42
2686740
2686744
2686744 //这个值很奇怪,我想
999
2686748
地址对我来说很有意义,但第四个值很奇怪,因为它正是int的地址.有人可以解释一下这种行为吗?
当我评论*pa = 666(第一个外观)时,控制台什么也没显示,所以这里有一些错误,但编译器没有显示错误.也许这是因为我的系统上的int的大小,我有一个64位的Windows-os,所以也许int是64位而不是32?并且因为第二次增量后*pa值是999而不是第一次?
我相信,有很多C程序员可以解释发生了什么:)
1> Gopi..:
int* pa=&a;
pa
是指向整数的指针,并*pa
定义了访问权限.
一旦递增指针,指针指向某个内存(在p之后),这个内存未由您分配或您不知道,因此取消引用它会导致未定义的行为.
pa++;
*pa
是UB
编辑:
使用正确的格式说明符打印%p
@haccks指出的指针值