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 = val
。p->a
はの省略形であることに注意してください(*p).a
。