ホームページ > バックエンド開発 > C++ > C および C での自動構造体と配列の部分初期化は許可および定義されていますか?

C および C での自動構造体と配列の部分初期化は許可および定義されていますか?

Barbara Streisand
リリース: 2024-12-11 08:49:10
オリジナル
985 人が閲覧しました

Is Partial Initialization of Automatic Structures and Arrays in C and C   Allowed and Defined?

C および C における自動構造体と配列の部分初期化

この誤解は、自動構造体と自動配列の部分初期化が行われるという誤った仮定から生じています。 C では許可されています。この考えに反して、標準では、完全な初期化または初期化なしの 2 つのケースのみが明示的に定義されています。初期化。

部分初期化

「部分初期化」という用語は規格では定義されていません。これは、構造体または配列内のメンバーのサブセットのみを初期化することを指します。

完全な初期化

完全な初期化は、構造体または配列のすべてのメンバーが明示的に初期化されるときに発生します。例:

struct somestruct {
  int a;
  int b;
  int c;
};

somestruct s = {1, 2, 3};
ログイン後にコピー

初期化なし

初期化が指定されていない場合、動作は変数の記憶域タイプによって異なります:

  • (スタック上の)自動変数の場合、初期化されていないメンバーは初期化されることが保証されません。それらの値は不定です。
  • 静的変数 (グローバルまたはファイル スコープを持つ) の場合、初期化されていないメンバーは整数型の場合は 0 に初期化され、ポインター メンバーの場合は NULL に初期化されます。

部分的実際の初期化

標準の動作ではないにもかかわらず、部分的な構造体と配列メンバーの自動初期化は、Visual Studio や gcc/g を含むほとんどのコンパイラでサポートされています。

C 標準 (C99)

セクション 6.7。 8.21 初期化

要素の数より少ない初期化子が提供された場合

C Standard (C 03)

セクション 8.5.1 集合体

存在する初期化子の数が少ない場合、初期化されていないメンバーは値が初期化されました。値の初期化はオブジェクトの種類によって異なります。たとえば、非共用体クラス型の非静的データ メンバーは値で初期化されますが、整数などのプリミティブ型はゼロで初期化されます。

結論

部分自動構造体と配列の初期化は非標準の動作であり、適切に処理しないと未定義の結果が生じる可能性があります。移植性と正確性を確保するために、常に完全な初期化を行うか、初期化を行わないようにしてください。

以上がC および C での自動構造体と配列の部分初期化は許可および定義されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート