2015-09-15 12 views
5

Cでは、構造体を定義するとき。新しいインスタンスを作成する正しい方法は何ですか?あるいは、Cで構造体の新しいインスタンスを作成する方法

listitem* newItem = malloc(sizeof(listitem)); 

です:最初の方法(Xcodeのは、これは構造体を再定義し、間違っていると言う)

struct listitem { 
    int val; 
    char * def; 
    struct listitem * next; 
}; 

struct listitem* newItem = malloc(sizeof(struct listitem)); 

に第二の方法を私は2つの方法を見てきました別の方法がありますか?

+4

* "(xCodeはこれが構造体と間違っていることを再定義しています")*。最初の方法は、構造体を再定義することも、間違っていることもないので、あなたが私たちに言っていないことがあります。 – user3386109

+0

@ user3386109ああ、そうだよ! XCodeはmain()ではなく関数内で使用していたので間違っているとしか言いませんでした。確かに理由はわかりません。 –

答えて

8

あなたがタイプlistitemを持つ変数の任意の宣言の前

typedef struct listitem listitem; 

を使用している場合にのみ機能します第二の方法。また、単に静的、動的にそれを割り当てるのではなく、構造体を割り当てることができます。

struct listitem newItem; 

をあなたが実証されてきた方法は、すべてのintために次の操作を行うようなもので、作成したい:

int *myInt = malloc(sizeof(int)); 
+0

'' typedef Foo_tag {...} Foo_t''と '' Foo_t''をすぐに使うという単純な規則は、Cプログラミングではうまくいきます。 '' typedef''には実際には入力コストだけがありますが、その後は '' struct Foo_tag''をまったくタイプしなくて済むようになりました。 – BitTickler

+0

'struct listitem newItem;'はファイルスコープで発生する場合にのみ静的割り当てです。ブロックスコープでは、これは自動割り当てです。 –

+0

@MMあなたは正しいのですが、一般的に言えば、 'malloc'と友人は動的割り当てを扱いますが、ファイル内の配置に関係なく他の形式の割り当ては頻繁にそれを区別するための「静的割り当て」と呼ばれます動的割り当て。 –

7

ポインタを必要とするかどうかによって異なります。無ポインタ構造のためにそれをインスタンス化した後

Typedef struct s_data 
{ 
    int a; 
    char *b; 
    etc.. 
}    t_data; 

それはこのようにあなたの構造を呼ぶ方が良いでしょう

t_data my_struct; 
my_struct.a = 8; 

そして、あなたはポインタをしたい場合、あなたは次のようにそれををmallocする必要がありますその:

t_data *my_struct; 
my_struct = malloc(sizeof(t_data)); 
my_struct->a = 8 

私はあなたの質問

にこの答えを願っています
関連する問題