在下面的示例中,指针p
是指向变量a
的指针。
我已经将p
的值增加了1,这将值增加了4,因为它是int。但是当我尝试打印*p
的值时,显示了一些不同的值。
我还附上了程序的输出。
有人能解释一下为什么显示*p
的值吗?
// POINTERS
#include<stdio.h>
int main(){
int a = 3;
int *p = &a;
printf("Value of p %d \n",p);
printf("Value of *p %d \n",*p);
p = p+1;
printf("After changing : value of p %d \n",p);
printf("After changing : value of *p %d \n",*p);
return 0;
}
输出:
3条答案
按热度按时间gtlvzcf81#
有人能解释一下为什么显示 *p的值吗?
不,没有人能解释为什么
*p
的最后一次打印给出了您看到的值。明天它可能会打印另一个值…或者根本不打印否则你的程序可能会崩溃或者会发生一些不一样的事
这叫做未定义行为。
您正在尝试读取内存位置(即原始
p
+ 1),就好像在该位置有一个int
。但是没有... C标准并没有定义当你这样做时会发生什么。所以什么事都有可能发生。进一步注意,你实际上已经有了undefined behavior:
要打印指针,必须使用
%p
并将指针转换为空指针。比如:所以你的程序的法律的版本:
bweufnob2#
你正在访问你(不一定)有权访问的内存。
假设
a
(4字节长)在这里访问您无权访问的内存属于未定义行为。
z31licg03#
行为是undefined,因为我们不能说该值存在于新地址位置。