【问题标题】:Null/void pointer incorrect valueNull/void 指针值不正确
【发布时间】:2013-05-15 14:08:45
【问题描述】:

我们在我们的一个函数中返回一个指向结构的指针。当我们在 main 中打印出结构的一个值时,它是正确的。但是,当我们将该指针传递给另一个函数并尝试访问一个值时,它会打印出一个不正确的值。看起来该值是一个地址。

这些调用在我们的主目录中:

struct temp * x = doThis();
printf("x->var1 = %d\n", x->var1);
doThat(&x);

在 doThat 中,我们打印出:

void doThat(void * x)
{
    struct temp * x2 = (struct temp *) x;
    printf("x2->var1 %d", x2->var1);
}

doThis 函数返回一个 void 指针,doThat 函数接受一个 void 指针作为参数。

【问题讨论】:

  • 很可能你需要doThat(x)
  • @KerrekSB 声明为doThat(void * x);
  • 这不是告诉你,你必须编写这个团队中没有人能够解释的荒谬演员阵容吗?
  • 通过使doThat 采用void* 参数,您将禁用可以避免此问题的类型检查。为什么doThat 不采用struct temp*struct temp**
  • @KerrekSB:演员阵容是不必要的; struct temp *x2 = x; 会编译并具有相同的语义。

标签: c pointers struct


【解决方案1】:

doThat 中,您将 x 转换为 struct temp*,但您传入了 struct temp**

您可以在此看到类似的结果:running code

更改自:

struct temp * x2 = (struct temp *) x;
printf("x2->var1 %d", x2->var1);

收件人:

struct temp ** x2 = (struct temp **) x;
printf("(*x2)->var1 %d", (*x2)->var1);

会解决这个问题。或者,不要通过更改将指针传递给指针:

doThat(&x);

收件人:

doThat(x); /* <= Note: Don't take the address of x here! */

【讨论】:

  • 那么不需要强制执行 doThat 吗? struct DirectMap * x1 = x; 这个调用有效,但打印 x1-&gt;var1 时不是打印地址,而是打印 0。但是, print x-&gt;var1 在我们的 doThis 函数和 main 中打印出正确的值。
  • 非常感谢!此更改解决了我们的问题。
猜你喜欢
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 2014-05-13
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多