2009-08-03 6 views
3

1行で構造体の配列のすべての値を変更します。
C - 私は構造体を宣言することができます

typedef struct 
{ 
    int var1; 
    int var2; 
    int var3; 
} test_t; 

そして、デフォルト値で、これらの構造体の構造体の配列を作成します。

test_t theTest[2] = 
{ 
    {1,2,3}, 
    {4,5,6} 
}; 

しかし、私は配列を作成した後、上記の方法と同じように値を変更する方法はありますか?ループを使わずに明示的にすべての値を指定します。

答えて

8

はC99では、一列に各構造を割り当てることができます。私はあなたが1行で構造体の配列を割り当てることができるとは思わない。

C99では、複合リテラルが導入されています。ここで博士ドブスの記事を参照してください:The New C: Compound Literals

theTest[0] = (test_t){7,8,9}; 
theTest[1] = (test_t){10,11,12}; 

あなたはこのようなポインタに割り当てることができます:

test_t* p; 
p = (test_t [2]){ {7,8,9}, {10,11,12} }; 

あなたは、同様のmemcpyを使用することができます。

memcpy(theTest, (test_t [2]){ {7,8,9}, {10,11,12} }, sizeof(test_t [2]); 

でテストの上にgcc -std = c99(バージョン4.2.4)(linux)

複合リテラルがどのように機能するかを理解するには、Dr. Dobbsの記事を読む必要があります。

+0

これらの組み合わせを試してみましょう。 –

+0

これで、割り当てループ用のマクロを作成することができます。そうすれば、再利用しやすく、きれいにすることができます。 – Loki

+0

+1はC89がそれを行うことができることを知っているので、C89はできません。 –

0

いいえ、あなたはこの方法で初期化することができます。 'one-line'メソッドを使用して構造体の値を変更することができます

+0

「値を変更できません」という意味ですか? C99に言及した答えも参照してください。 –

+0

申し訳ありませんが、私は-c99だけを使用し、それは言及しませんでした。私はしばしばこの機能を使います: "theTest [0] =(test_t){7,8,9};" – f0b0s

0

変数が別のソースからコピーされている場合は、memcpyのようなメソッドを使用して構造体の値を直接上書きできます。

ただし、個々の要素を設定する以外に、値を設定する直接的な方法はありません。場合

+0

あなたはC99について忘れました。 –

1

あなたがゼロ(または-1)、使用できるmemsetに値を設定する:

memset(struct_array, 0, sizeof(struct_array)); 
memset(struct_array, -1, sizeof(struct_array)); 
+0

真ですが、完全ではありません。あなたはC99について忘れてしまった。 –

+0

私はこれを、問題の一般的な特殊なケースの代替方法として説明しました。私はそれが完全な問題を解決すると主張しませんでした。 –

関連する問題