【问题标题】:Understanding NULL pointer [duplicate]了解 NULL 指针 [重复]
【发布时间】:2020-03-01 10:30:48
【问题描述】:

鉴于以下情况:

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;
}

我的问题是:怎么可能有 (p2 != NULL) IF (p1->b.c == NULL) ?

【问题讨论】:

  • NULL 的设置在哪里?我所看到的只是一个未初始化的p1,用于分配给p2??
  • 因为取消引用未初始化和 NULL 指针是未定义的行为。这意味着程序可能会崩溃,或者它可能会将0 放入p2,或者它可能会在p2 中放入一个非零值,或者它可能是任何其他未定义的行为。
  • p2 尚未分配值。你不能取消引用它。

标签: c pointers null


【解决方案1】:

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

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

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

你应该做的是先初始化变量。

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;
}

PS - 您的代码中的任何地方都没有 NULL 指针。所以实际上我不明白这个问题,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多