3

ポインターの配列のこの例を試しました。「関数メインの初期化が不正です」というエラーが表示されます

int main()
{
    int a[]={1,2,3,4,5};
    int b[]={1,2,3,4,5};
    int c[]={1,2,3,4,5};
    int *p[3]={a,b,c};
    int i;
    clrscr();
    for(i=0;i<3;i++)
        printf("%d - %u\n",*p[i],p[i]);
    getch();
}

配列宣言で int の代わりに static int を使用すると、正常に動作します。ここで静的な効果を教えてください。どうもありがとう。

4

4 に答える 4

5

-pedanticフラグを使用すると、gcc でこれに関する警告が表示されます。

しかし、これは明らかに標準で変更されたものであり、C90では次のように述べています。

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

p 配列は集約型であるため許可されませんでしたが、C99 では次のようになります。

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

于 2009-02-14T18:53:27.490 に答える
4

これは、gcc および gcc -ansi で正常にコンパイルされます。gcc -ansi -pedantic ただし、次の警告が表示されます。

blackjack.c: In function ‘main’:
blackjack.c:8: warning: initializer element is not computable at load time
blackjack.c:8: warning: initializer element is not computable at load time
blackjack.c:8: warning: initializer element is not computable at load time

一方、8行目は次のとおりです。

int *p[3]={a,b,c};

問題は、a、b、および c が p に格納される時点で、まだ存在していないことです。これは、それらがスタックに置かれ、スタック上の位置が関数のスコープ外のものに依存するためです。これを明確にするために、「ロード時間」とは、プログラムが既に実行されている時間ではなく、プログラムがメモリにロードされた時間を意味します。(とにかく、なぜ/どのように機能するかは聞かないでください)

于 2009-02-14T18:52:17.803 に答える
0

ルールは非常に単純です。静的オブジェクトの場合、初期化リストは一定である必要があります。スタック上のスペースが割り当てられる要素には、このような制限はありません。静的オブジェクトはデータセクションに書き込む必要があり、コンパイラは事前にそれらの値を解決できる必要があるため、これも論理的に見えます。問題の関数(main)が呼び出されると、スタックメモリが割り当てられます。問題はありません。turbo-cで逆の動作が発生する理由はわかりません。gccではこれが起こります:( gcc-Wallprog.cでコンパイルすると

        int *p[]={a,b,c} //works fine
        static int *p[]={a,b,c} //oops blunder
于 2011-11-25T02:40:28.543 に答える
0

試してください: printf("%d - %u\n",*(p[i]),p[i]);

私はあなたがもっと次のようなことをしようとしていると感じていますが:

int a[]={1,2,3,4,5};
int b[]={1,2,3,4,5};
int c[]={1,2,3,4,5};
int *p[3]={a,b,c};
int i;
clrscr();
for(i=0;i<sizeof(p)/sizeof(int*);i++) {
    for (int j =0; j < sizeof(a)/sizeof(int); j++) {
        printf("%d - %u\n",(p[i])[j],p[i]);
    }
}
getch();
于 2009-02-14T19:15:48.293 に答える