C语言 有人能解释一下这个程序的输出吗?

mbjcgjjk  于 2023-05-16  发布在  其他
关注(0)|答案(3)|浏览(110)

在下面的示例中,指针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;

}

输出:

友情链接[1]:https://i.stack.imgur.com/sTYlq.jpg

gtlvzcf8

gtlvzcf81#

有人能解释一下为什么显示 *p的值吗?
不,没有人能解释为什么*p的最后一次打印给出了您看到的值。
明天它可能会打印另一个值…或者根本不打印否则你的程序可能会崩溃或者会发生一些不一样的事
这叫做未定义行为
您正在尝试读取内存位置(即原始p + 1),就好像在该位置有一个int。但是没有... C标准并没有定义当你这样做时会发生什么。所以什么事都有可能发生。
进一步注意,你实际上已经有了undefined behavior

printf("Value of p %d   \n",p);
                   ^^
                   Wrong for pointers and therefore undefined behavior

要打印指针,必须使用%p并将指针转换为空指针。比如:

printf("Value of p %p   \n", (void*)p);
                   ^^        ^^^^^^^
             Specifier       cast to void-pointer
           for void-pointer

所以你的程序的法律的版本:

int a = 3;

int *p = &a;

printf("Value of p %p   \n", (void*)p);
printf("Value of *p %d  \n",*p);

p = p+1;

printf("After changing : value of p %p  \n", (void*)p);
// printf("After changing :  value of *p %d \n",*p); <-- Illegal so commented out
bweufnob

bweufnob2#

你正在访问你(不一定)有权访问的内存。
假设a(4字节长)在这里

+-+-+-+-+-+-+-+-+-+-+-+-+
| | | |a|a|a|a| | | | | |
+-+-+-+-+-+-+-+-+-+-+-+-+
 ^ ^ ^         ^ ^ ^ ^ ^   <== memory you do not have access to
       \------ |           <== p points here
               \------     <== p+1 points here and the pointer is valid

访问您无权访问的内存属于未定义行为

z31licg0

z31licg03#

行为是undefined,因为我们不能说该值存在于新地址位置。

相关问题