cで間接的に構造体の値を設定する方法は?

Aug 20 2020

ポインタを介して構造体の最初のメンバーにアクセスする方法を知りたいのですが。私はこれを試しました:

#include <stdio.h>
#include <stdlib.h>

struct foo
{
    int a;
    char *str;
};

int main()
{
    struct foo *p = malloc(sizeof(struct foo));
    int val = 10;
    *(int**)p = &val; //set the value of the first member of struct foo
    printf("%i\n",p->a);
}

しかし、それはいくつかのゴミを印刷します。同様の方法で設定するにはどうすればよいですか?

回答

Barmar Aug 20 2020 at 23:57

割り当ては次のようになります。

*(int*)p = val;

intメンバーに割り当てたいので、ポインタはへのポインタでintはなく、へのポインタである必要がありintます。また、割り当てられる値はint;でなければなりません。&valへのポインタintです。

3 MatthiasBerndt Aug 21 2020 at 00:01

そこで行っているのは、の値p->aをのアドレスに設定することですval(実装によっては、32ビットに切り捨てられる可能性があります)。

ポインタを介してフィールドにアクセスするには、フィールドのアドレスを取得してから、逆参照されたポインタに割り当てる必要があります。

int *pa = &p->a;
*pa = val;

もちろん、書くこともできますp->a = valp->aはの省略形であることに注意してください(*p).a