9

次のコードについて質問があります。

#include "all_needed.h"

static uint8_t array[2] = {0};

void main(void)
{
  ...
}

(モジュール) グローバル配列は、ANSI C 準拠である間に各メンバーをゼロに設定するために、上記のように初期化できますか?

Code Composer 5 (MSP430 プロジェクト) に問題があり、次のように変更する必要がありました。

static uint8_t array[2] = {0, 0};

配列の 2 番目のメンバーを正しく初期化するため。

4

5 に答える 5

11

はい、これは許可されており、配列をゼロに初期化する必要があります。C99、§6.7.8 p10:

静的ストレージ期間を持つオブジェクトが明示的に初期化されていない場合:

— ポインター型の場合、null ポインターに初期化されます。

— 算術型の場合、(正または符号なし) ゼロに初期化されます。

— 集合体の場合、すべてのメンバーはこれらの規則に従って (再帰的に) 初期化されます。

— 共用体の場合、最初の名前付きメンバーは、これらの規則に従って (再帰的に) 初期化されます。

そしてp21:

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

バグをコンパイラ ベンダーに報告してください。

于 2011-11-15T15:23:46.893 に答える
6

ご回答ありがとうございます。さらに調査したところ、 http: //www.ti.com/lit/pdf/SLAU157 セクション B.5.1「静的およびグローバル変数の初期化」で説明されているように、コンパイラが準拠していないことがわかりました。

付録 B: IAR 2.x/3.x/4.x から CCS C への移行

B.5 その他の相違点

B.5.1 静的およびグローバル変数の初期化

ANSI/ISO C 標準では、明示的な初期化を行わない静的変数とグローバル (extern) 変数は、(プログラムの実行を開始する前に) 0 に事前に初期化する必要があると規定されています。このタスクは通常、プログラムがロードされ、IAR コンパイラに実装されるときに実行されます。

/* IAR, global variable, initialized to 0 upon program start */
int Counter;

ただし、TI CCS コンパイラはこれらの変数を事前に初期化しません。したがって、この要件を満たすかどうかはアプリケーション次第です。

/* CCS, global variable, manually zero-initialized */
int Counter = 0;
于 2011-11-16T12:12:09.810 に答える
5

C規格は(6.7.8.21)と言っています:

ブレースで囲まれたリストにある初期化子の数が、集合体のメンバーの要素よりも少ない場合[...]、集合体の残りの部分は、静的な保存期間を持つオブジェクトと同じように暗黙的に初期化されます。

6.2.5.21では:

配列タイプと構造タイプは、まとめて集約タイプと呼ばれます。

言い換えれば、あなたのコードはOKです。

于 2011-11-15T15:25:13.130 に答える
4
static uint8_t array[2] = {0};

C 標準によると、これにより の両方のメンバーがarray0 に初期化されます。コンパイラがそれらをゼロにしない場合は違反です。

于 2011-11-15T15:19:25.863 に答える
0

私はPICmicrosを使用しているので、マイレージは異なる場合があります...

リンクできるスタートアップライブラリはいくつかあります。RAMを初期化することはできません。1つはすべてのRAMを0にクリアします。もう1つは、変数を通常どおりに初期化します。

リンカファイルを見て、それが何をしているのかを見てください。

于 2011-11-18T19:55:27.660 に答える