0

私はc(gcc)で次のフォームを持っています:

typedef struct {
  mem 1;
  mem 2;
  mem n;
} *obj;

で初期化されたそのタイプの構造体から特定のメンバーを取得するにはどうすればよいobj var;ですか?

4

1 に答える 1

0

まず、その宣言は無効です。識別子が数字であるメンバーを宣言しようとしています。私はあなたが実際にこれを望んでいると仮定します:

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

于 2012-11-08T21:41:26.867 に答える