0

関数の 1 つで構造体へのポインタを返しています。メインの構造体の値の 1 つを出力すると、それは正しいです。ただし、そのポインターを別の関数に渡して値にアクセスしようとすると、正しくない値が出力されます。その値はアドレスのようです。

これらの呼び出しは私たちのメインにあります:

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 ポインターを受け取ります。

4

1 に答える 1

8

x を aにdoThatキャストしてstruct temp*いますが、 a を渡します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! */
于 2013-05-20T22:25:39.373 に答える