私はc(gcc)で次のフォームを持っています:
typedef struct {
mem 1;
mem 2;
mem n;
} *obj;
で初期化されたそのタイプの構造体から特定のメンバーを取得するにはどうすればよいobj var;
ですか?
まず、その宣言は無効です。識別子が数字であるメンバーを宣言しようとしています。私はあなたが実際にこれを望んでいると仮定します:
typedef struct foo {
int mem_1;
int mem_2;
...
} *obj;
.
ドット( )を使用してプレーンな構造体メンバーにアクセスします。
struct foo bar;
bar.mem_1 = 2;
これはまったく問題ありません。コンパイラは正しいサイズのスタックスペースを自動的に割り当てます。さて、あなたobj var
はポインタ1なので、矢印(->
)でそのメンバーにアクセスします。
obj var;
var->mem_1 = 3;
もちろん、運が良ければ、これはセグメンテーション違反になります。そうでない場合は、デバッガーとの非常に長く啓発的なセッションが行われる可能性があります。struct foo
自身を宣言するのとは異なり、宣言obj var
またはそれに相当するstruct foo *var
ものは、初期化されていないポインタ以外は何も作成しません。このためのメモリを自分で提供する必要があります。
obj var = malloc(sizeof(*var));
これは単にメモリを提供するだけであり、その内容はまだ定義されていませんが、安全に割り当てることができることに注意してください。
1:これはtypedef
あなたがやったようにポインターを取り除くことに関する問題です。typedefを表示したり、コンパイラから通知され.
たりせずに、使用する必要があるかどうかを知ることは不可能です。ポインタを非表示にするために
->
使用しないでください。typedef