0

コードが壊れるかどうかを確認するために、次のコードをcで記述しました。

int main(void)
{
    int A [5] [2] [3];
    printf("%d\n\n", A[6]);
    printf("%d\n\n", &A[6][0][0]);
    system("pause");
}

今、私が予期していなかったコードが壊れることはありません。多次元配列を宣言するとき:int A [5][2][3]、それは概念的に、最初のレベルのAが5要素(0〜4)の1次元配列であり、その配列のすべての要素自体が2要素の1次元配列であることを意味しません。その配列のすべての要素は3つの要素の1次元配列ですか?その概念が正しければ、どのよう A[6][0][0]に存在することもできます-最初のレベルでは5つの要素(0ベース)しかないためです。

助けていただければ幸いです。

4

2 に答える 2

5

配列外の位置にアクセスしていますが、はありませんA[6]。これは未定義の動作であり、何かが起こる可能性があります。

これA[5]は明確に定義された場所(配列の終わりを過ぎた場所)であるため、その場所へのポインターを取得することは合法ですが、そのポインターにアクセスしようとすることは合法ではありません。ただし、ポインタA[6]またはその他のより大きなインデックスを取得することは完全に定義されていません。

于 2012-05-24T21:32:52.990 に答える
0

Cは配列境界チェックを行いません。の場合、ポインタ演算のようint A[4]に考えてください。A[5]*(A + 5)

5つの要素(0〜4)でのみ宣言されている場合でもA、Cでは、を使用して、配列の宣言された境界外のメモリを参照できますA

このアクセスの結果は未定義です。を読むA[5]と、ゴミが出る可能性があります。を書くA[5]と、つまりA[5] = 13、割り当てられた別のメモリブロックが破損する可能性があります。

wikiの記事はこれを理解するためのかなり良いスタートですが、 K&Rのコピーを手に取り、それを読んで、すべての演習を行うことをお勧めします。

于 2012-05-24T21:37:08.300 に答える