C 不引用而取消引用是否非法?

C 不引用而取消引用是否非法?,c,pointers,C,Pointers,我尝试使用以下代码将值存储在未初始化的指针中,但出现了分段错误(核心转储错误) #包括 int main() {const int a=9; int*p=&a; scanf(“%d”,p+1); printf(“%d%d”,*p,*(p+1)); 返回0; } 请解释一下原因?这里没有你的问题 scanf("%d",p+1); 不允许您以p+1的身份访问内存位置,它位于程序可合法访问的内存之外,换句话说,内存位置无效。尝试访问(读/写)无效内存位置会调用未定义的行为 我

我尝试使用以下代码将值存储在未初始化的指针中,但出现了分段错误(核心转储错误)

#包括
int main()
{const int a=9;
int*p=&a;
scanf(“%d”,p+1);
printf(“%d%d”,*p,*(p+1));
返回0;
}
请解释一下原因?这里没有你的问题

 scanf("%d",p+1);
不允许您以
p+1
的身份访问内存位置,它位于程序可合法访问的内存之外,换句话说,内存位置无效。尝试访问(读/写)无效内存位置会调用未定义的行为

我尝试在未初始化的指针中存储一个值

这是一个初始化指针:
int*p=&a

但是,在C语言中,不能将
const int*
分配给
int*
,它是无效代码,不会干净地编译

scanf(“%d”,p+1)

代码
p+1
超出了分配变量的范围。您告诉scanf,在没有分配内存的地址存储某些内容是可以的。这是未定义的行为,可能会崩溃

*(p+1)


这里您取消引用指针,再一次有一项超出范围。这是不允许的-这是未定义的行为,可能会导致崩溃。

此处没有未初始化的指针。唯一的指针是
p
,它被很好地初始化为指向
a
。但是您访问非法内存,因为
p+1
没有指向与
p
相同的数据对象,即使您没有越界并因此具有未定义的行为,在尝试写入常量对象时仍将具有未定义的行为。两错不等于一对,未定义的行为仍然是未定义的。@Lundin我认为它被用作scanf的参数,所以它不打印。无效内存位置下有什么?悬空的PTR和无效的内存位置有什么关系吗?啊,对了,没关系。我的大脑在想printf:)@Lundin这个代码有效吗?@HimanshuDash它肯定无效。
 scanf("%d",p+1);