2016-09-19 12 views
9

を構造体を初期化します。は私が構造を持っている単一のフィールドで

struct MY_TYPE { 
     boolean flag; 
     short int value; 
     double stuff; 
    }; 

私はでそれをintializeことができます知っている:

MY_TYPE a = { .flag = true, .value = 123, .stuff = 0.456 }; 

しかし、今、私は変数My_TYPE*ポインタを作成する必要があると私はしたいです1つのフィールドを初期化するには?私は例を試しました:

MY_TYPE *a = {.value = 123}; 

コンパイルエラー"Designator in intializer for scalar type 'struct MY_TYPE *'"が表示されます。

構造体を1つのフィールドで初期化することはできますか?

+7

エラーは1つのフィールドとは関係ありません。 'struct initializer'でポインタを初期化することはできません。 – 2501

+0

私の目標を達成することは不可能なのですか、それとも私の目標を達成する別の方法ですか? –

+0

これは不可能ですが、構文上非常によく似たいくつかの方法が以下の回答に示されています。 – 2501

答えて

15

まず第一に、あなたはstruct MY_TYPEとのtypedefを混合しています。その理由で投稿されたコードは機能しません。あなたが探しているものを達成するためにあなたは、その後、化合物リテラルへのポインタを使用することができます

typedef struct 
{ 
    bool flag; 
    short int value; 
    double stuff; 
} MY_TYPE; 

:あなたはこのように行う必要があるでしょう

MY_TYPE* ptr = &(MY_TYPE){ .flag = true, .value = 123, .stuff = 0.456 }; 

しかし、化合物があることに注意してくださいリテラルはローカルスコープを持ちます。これらのデータをローカルスコープの最後を過ぎて使用する場合は、静的または動的に割り当てられた変数へのポインタを使用する必要があります。

4

構造体の実際のインスタンスを最初に作成して、必要な方法で初期化した後、ポインタを指すようにすることは可能です。

など。

struct MY_TYPE a = {.value = 123}; 
struct MY_TYPE *p = &a; 

構造体を動的に割り当てる場合は、不可能です。次に、2つのステップでそれを行う必要があります。

struct MY_TYPE *p = calloc(1, sizeof *p); 
p->value = 123; 

あなたが初期化とは何の関係もない誤差が出ていますが、ポインタでない何かでポインタを初期化しようとしている:初期化が続きます。

5

compound literalsを使用できます。

#include <stdio.h> 
#include <stdbool.h> 

struct MY_TYPE 
{ 
    bool flag; 
    short int value; 
    double stuff; 
}; 

int main(void) 
{ 
    struct MY_TYPE *a = &(struct MY_TYPE){.value = 123}; 

    printf("%d\n", a->value); 
} 
関連する問題