2

以前は、次の方法で構造を初期化していました。

struct A a = {0};

これは私にとってはうまくいくようですが、ANSI C、C89、C99規格について議論されました。
単に私はどのドキュメントでもそれを見つけることができませんでした。
それを手伝ってくれませんか。
これが「cl」(VSexpress2008)で機能する例を次に示します。

#include <stdio.h>
struct DATA
{
    int a;
    int b;
    char tab[3];
};


int main(void)
{
    struct DATA A;
    struct DATA B = {0};

    printf("A.a: %d, A.b: %d, A.tab: %s\n", A.a, A.b, A.tab);
    printf("B.a: %d, B.b: %d, B.tab: %s", B.a, B.b, B.tab);
};
>>>>>OUTPUT:
D:\N\workspace>test.exe

A.a: 4203600, A.b: 451445257, A.tab: ■   
B.a: 0, B.b: 0, B.tab:

これは、最初に1で初期化し、残りが0であることを示しています。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int a;
    int b;
} ASDF;

ASDF A = {1};

int main()
{
    printf("a:%d,b:%d\n",A.a,A.b);
    return 0;
}
Output:
a:1,b:0
4

1 に答える 1

2

そうです、これは常に機能します。C99 ドラフト N1256 の関連セクションは 6.7.8 (初期化) です。

21.集合体の要素またはメンバーよりもブレースで囲まれたリストの初期化子が少ない場合、または配列内の要素よりも既知のサイズの配列を初期化するために使用される文字列リテラルの文字が少ない場合、集約は、静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。

静的保存期間のオブジェクトはゼロに初期化されます (同セクションの段落 10)。

ANSI 標準の方が短いですが、3.5.7 と同様です。

集合体のメンバーよりもリスト内の初期化子が少ない場合、集合体の残りの部分は、静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。

于 2010-10-07T09:35:33.850 に答える