545

構造体要素を初期化し、宣言と初期化に分割したい。これは私が持っているものです:

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

void function(void) {
  MY_TYPE a;
  ...
  a = { true, 15, 0.123 }
}

MY_TYPEこれは、C プログラミング言語標準 (C89、C90、C99、C11 など) に従ってのローカル変数を宣言および初期化する方法ですか? または、より良いもの、または少なくとも機能するものはありますか?

更新必要に応じてすべてのサブ要素を設定する静的な初期化要素ができました。

4

16 に答える 16

849

(ANSI)C99では、指定された初期化子を使用して構造を初期化できます。

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

他のメンバーはゼロとして初期化されます:「省略されたフィールドメンバーは、静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。」(https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

于 2008-12-01T13:39:37.323 に答える
235

複合リテラルでそれを行うことができます。そのページによると、C99(ANSI Cとしてもカウントされます)で動作します。

MY_TYPE a;

a = (MY_TYPE) { .flag = true, .value = 123, .stuff = 0.456 };
...
a = (MY_TYPE) { .value = 234, .stuff = 1.234, .flag = false };

初期化子での指定はオプションです。次のように書くこともできます。

a = (MY_TYPE) { true,  123, 0.456 };
...
a = (MY_TYPE) { false, 234, 1.234 };
于 2008-12-01T13:28:09.003 に答える
48

a = (MYTYPE){ true, 15, 0.123 };

C99でうまくいくだろう

于 2008-12-01T13:27:22.280 に答える
25

あなたはほとんどそれを手に入れました...

MY_TYPE a = { true, 15, 0.123 };

「struct initialize c」で クイック検索すると、これが表示されます

于 2008-12-01T13:21:54.333 に答える
23

C プログラミング言語標準ISO/IEC 9899:1999 (一般に C99 として知られている) では、指定された初期化子を使用して、構造体または共用体のメンバーを次のように初期化できます。

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

これは、ISO/IEC 9899:1999 標準のparagraph 7セクションで次のように定義されています。6.7.8 Initialization

指定子の形式が
. 識別子
の場合、現在のオブジェクト (以下で定義) は構造体または共用体型を持ち、識別子はその型のメンバーの名前でなければなりません。

paragraph 9同じセクションの次のように述べていることに注意してください。

明示的に別段の記載がある場合を除き、この節の目的のために、構造体および共用体型のオブジェクトの名前のないメンバーは初期化に参加しません。構造体オブジェクトの名前のないメンバーは、初期化後でも値が不定です。

ただし、GNU GCC 実装では、省略されたメンバーはゼロまたはゼロのような型に適した値として初期化されます。GNU GCC ドキュメントのセクション6.27 Designated Initializersで述べたように:

省略されたフィールド メンバーは、静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。

Microsoft Visual C++ コンパイラは、公式ブログ投稿C++ Conformance Roadmapに従って、バージョン 2013 以降、指定された初期化子をサポートする必要があります。Initializing unions and structsMSDN Visual Studio ドキュメントのInitializers記事の段落では、GNU GCC と同様に、名前のないメンバーがゼロのような適切な値に初期化されることが示唆されています。

ISO/IEC 9899:1999 に取って代わった ISO/IEC 9899:2011標準 (一般に C11 として知られている) は、セクションの下に指定された初期化子を保持しています6.7.9 Initialization。こちらも相変わらずparagraph 9

ISO/IEC 9899:2011 に取って代わった新しいISO/IEC 9899:20186.7.9 Initialization標準 (一般に C18 として知られている) は、セクションの下に指定された初期化子を保持しています。こちらも相変わらずparagraph 9

于 2016-06-08T11:43:11.043 に答える
17

ロン・ヌニが言ったように:

typedef struct Item {
    int a;
    float b;
    char* name;
} Item;

int main(void) {
    Item item = {5, 2.2, "George"};
    return 0;
}

覚えておくべき重要なこと: 構造体のオブジェクト/変数を 1 つでも初期化すると、他のすべての変数がデフォルト値に初期化されます。

構造体の値を初期化しない場合 (つまり、その変数を宣言するだけの場合) 、宣言がローカルである場合variable.membersにのみ、すべてに「ガベージ値」が含まれます。

宣言がグローバルまたは静的である場合 (この場合のように)、初期化されていないものはすべてvariable.members自動的に次のように初期化されます。

  • 0整数と浮動小数点の場合
  • '\0'for (もちろんこれは ,とchar同じで、整数型です)0char
  • NULLポインタ用。
于 2013-09-04T09:37:18.910 に答える
5

私はこれらの答えのどれも気に入らなかったので、自分で作りました。これが ANSI C かどうかはわかりません。デフォルト モードの GCC 4.2.1 です。括弧を覚えることができないので、データのサブセットから始めて、シャットダウンするまでコンパイラ エラー メッセージと格闘します。読みやすさは私の最優先事項です。

// in a header:
typedef unsigned char uchar;

struct fields {
  uchar num;
  uchar lbl[35];
};

// in an actual c file (I have 2 in this case)
struct fields labels[] = {
  {0, "Package"},
  {1, "Version"},
  {2, "Apport"},
  {3, "Architecture"},
  {4, "Bugs"},
  {5, "Description-md5"},
  {6, "Essential"},
  {7, "Filename"},
  {8, "Ghc-Package"},
  {9, "Gstreamer-Version"},
  {10, "Homepage"},
  {11, "Installed-Size"},
  {12, "MD5sum"},
  {13, "Maintainer"},
  {14, "Modaliases"},
  {15, "Multi-Arch"},
  {16, "Npp-Description"},
  {17, "Npp-File"},
  {18, "Npp-Name"},
  {19, "Origin"}
};

データは、タブ区切りのファイルとして開始される場合があります。これを検索して置換すると、別のファイルに変換されます。はい、これは Debian のものです。したがって、{} の外側のペア (配列を示す) と、内側の各構造体の別のペアです。間はコンマで。ヘッダーに物事を入れることは厳密には必要ではありませんが、構造体に約 50 個の項目があるので、それらを別のファイルに入れたいと思います。両方とも、コードが混乱しないようにするためであり、交換が簡単です。

于 2016-05-12T17:14:03.263 に答える
3

MS が C99 にアップデートしていない場合、MY_TYPE a = { true,15,0.123 };

于 2014-04-20T19:39:46.633 に答える
3
void function(void) {
  MY_TYPE a;
  a.flag = true;
  a.value = 15;
  a.stuff = 0.123;
}
于 2008-12-01T13:19:49.877 に答える
1

C の構造体は、次のように宣言および初期化できます。

typedef struct book
{
    char title[10];
    char author[10];
    float price;
} book;

int main() {
    book b1={"DS", "Ajay", 250.0};

    printf("%s \t %s \t %f", b1.title, b1.author, b1.price);

    return 0;
}
于 2017-09-06T18:38:28.550 に答える
-3

私は構造体を初期化する良い方法を探していましたが、以下を使用する必要があります (C99)。これにより、単純な型と同じ方法で、単一の構造体または構造体の配列を初期化できます。

typedef struct {
    char *str;
    size_t len;
    jsmntok_t *tok;
    int tsz;
} jsmn_ts;

#define jsmn_ts_default (jsmn_ts){NULL, 0, NULL, 0}

これは、コードで次のように使用できます。

jsmn_ts mydata = jsmn_ts_default; /* initialization of a single struct */

jsmn_ts myarray[10] = {jsmn_ts_default, jsmn_ts_default}; /* initialization of
                                                    first 2 structs in the array */
于 2018-12-02T17:46:09.513 に答える