1

ポインターの配列アドレス計算演算を試していました。上記のコードの出力と混同しました。何が起こっているのか誰か説明してもらえますか?

void foo()
{
    int i=10,k=3,l=20,m=30;
    int *ary[2];
    ary[0]=&i;
    int b=20;
    ary[1]=&k;

    printf("%d\n",ary[0][1]);
}

出力は 3

第二プログラム

void foo()
{
    int i=10,k=3,l=20,m=30;
    int *ary[2];
    ary[0]=&i;
    int b=20;
    ary[1]=&b;

    printf("%d\n",ary[0][1]);
}

出力は 20 です。

これらの上記のコードでアドレス計算はどのように行われますか?

4

2 に答える 2

3

どちらのコード サンプルary[0]でも、単一の整数へのポインターです。そのarray[0][1]ため、そのポインターに範囲外でアクセスしていることになります。したがって、両方のコード サンプルの動作は未定義です。

特定のコンパイラで見られる動作が得られる理由は、おそらく、アドレスを取得しないすべての変数がメモリではなくレジスタに格納されているためです (または、まったく格納されていない可能性があります。それらを使用することはありません)。

したがって、例 1 では、メモリ内の変数は i と k だけです。例 2 では、メモリ内の変数は i と b だけです。したがって、例 1はメモリ内のk直後の変数であり、例 2 ではその変数はです。ib

于 2012-06-24T06:52:13.160 に答える
0

あなたの主張は

int *ary[]

関数の引数では、配列はポインターに減衰します。だからあなたは基本的に持っています

int** ary

次に、おそらく有効なインデックスであるインデックス 0 のポインターを、単一の変数の値に設定します。

ary[0]=&i;

次に、コードが印刷されます

ary[0][1]

これは基本的に

( &i )[1]

未定義の動作をトリガーするため、得られる結果はすべて有効な結果です。

于 2012-06-24T06:52:03.413 に答える