指针行为的值为1

时间:2018-08-26 04:25:22

标签: c++ c pointers gcc

需要明确的是,我知道C语言中的指针概念指针,并且取消了对双重,三重指针的引用。我唯一的疑问是在我编写的以下程序中:

#include<stdio.h>
int main(){
    int a;
    int* p;
    a=5;
    p=&a;
    int **q;
    printf("*p=%d\n",*p);
    printf("*q=%d\n",*q);
}

现在我知道,该程序非常愚蠢,没有任何意义,但这不是问题所在。问题是为什么? 为什么输出是这样的:

*p=5
*q=1

为什么每次运行* q = 1? 如果我现在声明*** r,也要牢记; 并添加以下行:

printf("*r=%d\n",*r);

现在的输出是:

*p=5
*q=-40821602 //garbage
*r=1

现在,* r = 1。为什么? ****也一样。在这种情况下,* q,* r是垃圾,* s = 1。为什么?

1 个答案:

答案 0 :(得分:0)

评估未初始化的指针是未定义的行为,这就是您所做的。 cppreference针对未定义的行为说明以下几点:

  

未定义的行为

     
      
  • 未定义的行为-对程序的行为没有任何限制。未定义行为的示例包括在数组范围之外的内存访问,有符号整数溢出,空指针取消引用,在不带序列点的表达式中多次修改同一标量,通过不同类型的指针访问对象等。编译器不需要使用它们来诊断不确定的行为(尽管可以诊断许多简单情况),并且不需要编译后的程序执行有意义的操作。
  •   

因此,您不能指望程序中会出现有意义的事情。它可以打印1,但也可以执行其他任何操作。以我为例,它只是崩溃了。

所以问题“为什么?” 根本不是有效的问题。