4

重複の可能性:
C および C++ : 自動構造の部分的な初期化

長い間、私は使用しています

char array[100] = {0};

配列のすべての要素を 0 に初期化します。ただし、最近、これが機能しないコンパイラ (Texas Instruments の Code Composer Studio) に出くわしました。このステートメントは、最初の要素のみを 0 に初期化する効果がありました。

この動作は、C と C++ の違い、コンパイラの違い、または実装のバグですか?

4

3 に答える 3

11

ただのバグです。C と C++ の両方arrayで、ゼロで埋める必要があります。


これは小さな答えなので、船外に出るかもしれません:

C++11 §8.5.1/7:

集約内のメンバーよりもリスト内の初期化句が少ない場合、明示的に初期化されていない各メンバーは、空の初期化子リスト (8.5.4) から初期化されます。[例: 、 、およびフォームの式の値、つまり で初期
struct S { int a; const char* b; int c; };
S ss = { 1, "asdf" };
化しss.aます。—終わりの例]1ss.b"asdf"ss.cint()0

C99 §6.7.8/21 (申し訳ありませんが、C11 を手元に置かないでください):

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

于 2013-01-08T23:01:16.687 に答える
5

C では、部分的な初期化はありません ( C11 標準の 6.7.9/19 を参照)。オブジェクトは、完全に初期化されているか (すべてのバイト)、完全に初期化されていません。

あなたのコンパイラは C 準拠ではありません。

初期化はイニシャライザ リストの順序で行われます。特定のサブオブジェクトに指定された各イニシャライザは、同じサブオブジェクトの以前にリストされたイニシャライザをオーバーライドします。明示的に初期化されていないすべてのサブオブジェクトは、静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。

于 2013-01-08T23:04:18.067 に答える
4

コンパイラのドキュメントを確認してください。すべての要素を初期化するには、適合する C または C++ コンパイラが必要です0が、一部のコンパイラ、特に組み込みの世界では、パフォーマンス上の理由から実装を調整するための非 ISO オプション (デフォルトで設定されている場合もあります!) があります。

具体的には、コンパイラがCOFF ABI モードであるかどうかを確認します。

6.13 COFF ABI モードでの静的変数とグローバル変数の初期化

ANSI/ISO C 標準では、明示的な初期化を行わないグローバル (extern) 変数と静的変数は、プログラムの実行を開始する前に 0 に初期化する必要があると規定されています。このタスクは通常、プログラムのロード時に実行されます。ロード プロセスはターゲット アプリケーション システムの特定の環境に大きく依存するため、COFF ABI モードでは、コンパイラ自体が 0 に初期化する準備をしません。そうしないと、実行時に静的ストレージ クラス変数が初期化されません。この要件を満たすかどうかは、アプリケーション次第です。

グローバル オブジェクトの初期化

注: コンパイラが既定でゼロに設定すると予想されるすべてのグローバル オブジェクトを明示的に初期化する必要があります。C6000 EABI モードでは、初期化されていない変数は自動的にゼロ初期化されます

「TMS320C6000 Optimizing Compiler v7.4 ユーザーズガイド」より

http://www.ti.com/lit/ug/spru187u/spru187u.pdf

于 2013-01-08T23:04:24.860 に答える