3

YashavantKanetkarの本LetusCを読んでいます。

ポインタの配列セクションには、問題を引き起こしているコードのセクションがあります。

int main()
{
    static int a[]={0,1,2,3,4}; //-----------(MY PROBLEM)
    int *p[]={a,a+1,a+2,a+3,a+4};
    printf("%u %u %d\n",p,*p,*(*p));
    return 0;
}

私が理解していないのは、なぜ配列aを静的として初期化する必要があるのか​​ということです。staticキーワードなしで初期化しようとしましたが、「不正」というエラーが発生しました。助けてください。

4

2 に答える 2

5

C90 (6.5.7) は

静的ストレージ期間を持つオブジェクトの初期化子、または集約型または共用体型を持つオブジェクトの初期化子リスト内のすべての式は、定数式でなければなりません。

また、集約型を持つオブジェクトを初期化しているため、値はコンパイル時に既知である必要があり、自動変数のアドレスはその場合ではありません。

これは C99 (6.7.8/4) で変更されたことに注意してください。

静的記憶域期間を持つオブジェクトの初期化子のすべての式は、定数式または文字列リテラルでなければなりません。

集約型または共用体型のオブジェクトに対する制約は削除されましたが、他の場所に配置されていません。static が削除されたコードは、C99 コンパイラによって受け入れられる必要があります (gcc -std=c99たとえば、他の場所で制約を見落としていないことを確認しているようです)。

于 2012-08-30T06:36:56.917 に答える
2

私の推測では、配列初期化子の内容はコンパイル時の定数でなければなりません。関数内のローカル変数で使用staticすることにより、ローカル スコープを除いて、基本的にその変数をグローバルにします。

于 2012-08-30T06:29:00.797 に答える