您正在索引數組末尾(緩衝區溢出)並重新分配堆棧上的其他變量。
int abc[3], i, j;
// Your stack looks like this (single 'x' is one byte):
// |abc[0]|abc[1]| abc[2]| j | i |
//
// |xxxx |xxxx |xxxx |xxxx|xxxx|
//
for(j=0; j<3; j++);
printf("%d\n", j);
// j = 3 at this point
// abc[3] points past the end of the array abc, in this case, at j.
// So the next statement increments j by 3.
abc[j] = abc[j] + 3;
printf("%d \n", j);
要驗證,嘗試在末尾添加以下語句:
printf("%d\n", &i == &abc[3]);
printf("%d\n", &j == &abc[3]);
編輯
堆棧將取決於你使用的編譯器物質的確切佈局:
[email protected]:~/Desktop/stackoverflow$ gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[email protected]:~/Desktop/stackoverflow$ ./a.out
3
3
這就是爲什麼它的工作原理Ë我的機器上 - 聲明:
printf("abc: %x abc[3]: %x i: %x j: %x\n", &abc, &abc[3], &i, &j);
給出了下面的輸出:
abc: 4cd0aa70 abc[3]: 4cd0aa7c i: 4cd0aa8c j: 4cd0aa88
所以堆棧居然是:
// aa70 aa74 aa78 aa7c aa88 aa8c
// |abc[0]|abc[1]| abc[2]| | .... | j | i |
所以當它訪問abc[3]
,它的訪問0x4cd0aa7c
這只是「死亡空間」。
我得到3 3作爲我的VC++編譯器的輸出 – 2011-02-01 07:08:05
什麼是數組abc初始化爲? – 2011-02-01 07:11:13