C 理解空指针

C 理解空指针,c,pointers,null,C,Pointers,Null,鉴于以下情况: typedef struct d { int x; } D; typedef struct c { D d; } C; typedef struct b { struct c *c; } B; typedef struct a { B b; } A; int main() { A *p1; D *p2; p2 = &p1->b.c->d; } 我的问题是:如果(p1->b.c==NULL),怎么可能有(p2!=NULL)

鉴于以下情况:

typedef struct d
{
  int x;
} D;

typedef struct c
{
  D d;
} C;

typedef struct b
{
  struct c *c;
} B;

typedef struct a
{
  B b;
} A;

int main()
{
  A *p1;
  D *p2;

  p2 = &p1->b.c->d;
}
我的问题是:如果(p1->b.c==NULL),怎么可能有(p2!=NULL)

如果取消引用(使用)不引用任何对象的指针是未定义的行为

int main()
{
  A *p1;
  D *p2;

  p2 = &p1->b.c->d; // <- undefined behaviour anything can happen as p1 value is undetermined
}

PS-代码中任何地方都没有空指针。因此,实际上我不理解这个问题,

在哪里设置了
NULL
?我所看到的是一个未初始化的
p1
,用于
p2
?的赋值,因为取消引用未初始化和空指针是未定义的行为。这意味着程序可能会崩溃,或者它可能会将
0
放入
p2
中,或者它可能会将非零值放入
p2
中,或者它可能是任何其他未定义的行为。
p2
尚未分配值。您不能取消对它的引用。
int main()
{
  A a1;
  B b1;
  C c1;
  D d1;
  A *p1 = &a1;
  D *p2;

  p1 -> b = b1;
  p1 -> b.c = &c1;
  p1 -> b.c -> d = d1;
  p2 = &p1 -> b.c -> d;
}