コード:
#include <stdio.h>
int main(void)
{
int m[3][3];
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
m[i][j] = 900 + i * 10 + j;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
printf(" %p: m[%d][%d]=%d\n", &m[i][j], i, j, m[i][j]);
printf("\n");
printf(" %p: m[0][3]=%d\n", &m[0][3], m[0][3]);
printf(" %p: m[1][3]=%d\n", &m[1][3], m[1][3]);
printf(" %p: m[1][4]=%d\n", &m[1][4], m[1][4]);
return 0;
}
実行結果
コード:
00FFF984: m[0][0]=900
00FFF988: m[0][1]=901
00FFF98C: m[0][2]=902
00FFF990: m[1][0]=910
00FFF994: m[1][1]=911
00FFF998: m[1][2]=912
00FFF99C: m[2][0]=920
00FFF9A0: m[2][1]=921
00FFF9A4: m[2][2]=922
00FFF990: m[0][3]=910
00FFF99C: m[1][3]=920
00FFF9A0: m[1][4]=921
m[0][3] は m[1][0] と同じ場所だということ。
m[1][3] は m[2][0] と同じ場所だということ。
m[1][4] は m[2][1] と同じ場所だということ。
m[0][-1] や m[2][3] ならメモリが割り付けれていないから、
他の変数を壊したり、関数からのリターンアドレスなどを
壊したりして、わけの分からない動作をするということです。