アプリ版:「スタンプのみでお礼する」機能のリリースについて

グローバルな構造体のメンバ変数のアドレスはどうやって取得したらいいでしょうか?

A 回答 (4件)

わざわざ MacroGetOffset を作らずとも, ISO C には offsetof というマクロが既に定義されてます>#2


ということで, オフセット (構造体の先頭から当該メンバまでの距離) はこれでわかります.
    • good
    • 0

★Tacosan さんへ


・offsetof() マクロ名が思い出せなかったので、便利マクロとして紹介してしまいました。
 どうも有り難うございます。
    • good
    • 0

★アドレス値なの?オフセット値なの?


・下にオフセットを求める方法を紹介します。

構造体:
struct tag {
 char a;
 short b;
 int c;
 long d;
} tag;

●オフセットの求め方
構造体 tag のメンバ a のオフセット値(0)⇒(size_t)((size_t)&tag.a - (size_t)&tag.a)
構造体 tag のメンバ b のオフセット値(2)⇒(size_t)((size_t)&tag.b - (size_t)&tag.a)
構造体 tag のメンバ c のオフセット値(4)⇒(size_t)((size_t)&tag.c - (size_t)&tag.a)
構造体 tag のメンバ d のオフセット値(8)⇒(size_t)((size_t)&tag.d - (size_t)&tag.a)
※カッコ内は私の環境で試した結果です。→環境によって違うかもね。

●便利マクロ関数
#define MacroGetOffset(tag,name) ((size_t)(&((tag *)0)->name))
構造体 tag のメンバ a のオフセット値(0)⇒MacroGetOffset(struct tag,a)
構造体 tag のメンバ b のオフセット値(2)⇒MacroGetOffset(struct tag,b)
構造体 tag のメンバ c のオフセット値(4)⇒MacroGetOffset(struct tag,c)
構造体 tag のメンバ d のオフセット値(8)⇒MacroGetOffset(struct tag,d)

最後に:
・構造体のメンバ変数のアドレスなら (&tag.a) と『&』演算子を利用します。
 構造体の先頭アドレスからメンバ変数までのオフセットを計算したい場合は、上記の方法や
 便利マクロ関数を利用することで計算できます。上記では (size_t) にしていますが、(char)
 型にキャストしても良いでしょう。
・以上。参考に!
    • good
    • 1

普通に&で取れない?


構造体の変数名がxで、メンバ名がaなら
&(x.a)
で取れると思うけど。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!