C语言整型数组中的一个诡异死循环,答案大侠们进来啊

C语言整型数组中的一个诡异死循环,在线等答案大侠们进来啊~~
#define ARRAY_SIZE 10

void nutural_numbers(void)
{
int i;
int array[ARRAY_SIZE];

i = 1;

while(i<=ARRAY_SIZE)
{
array[i] = i - 1;
i = i + 1;
}
}
谁能告诉我这个函数为什么会死循环,调试中发现array[10](已越界)总是和i相等,修改其中一个会同时修改另一个。

------解决方案--------------------
没有死循环。。i<=ARRAY_SIZE越界改成i<ARRAY_SIZE
------解决方案--------------------
array[ARRAY_SIZE];溢出之后,数据会覆盖i地址所在的内容,因而可能造成死循环
------解决方案--------------------
经典的内存分配的问题
------解决方案--------------------
探讨

举一个溢出的例子:
本来buf 应该输出空的,但是结果不是,因为data溢出的数据覆盖了buf的数据:
C/C++ code
#include <iostream>
#include <string>
using namespace std;

int main()
{
char buf[30] = {0};
char data[1];

strcpy(da……

------解决方案--------------------
假设I等于10时,循环成立,但array[i]处就变成了array[10],而因为数组下标是从0开始的,所以出现溢出,而编译器设置变量的地址时一般在代码中相邻的变量地址是在一起的,就是4楼说的那种情况!

刚在我的电脑上OD载入了一下这个单独的函数,发现变量I当变成10时不管跑几次都还是10,仔细看了下,溢出,在array[i] = i - 1;处将用于存放循环变量的i的地址处的10减了1,然后在最后循环跑完时又加上了一,所以,当I增加到10时,就一直变成了10,溢出也只溢出了这一个部分,其它的电脑上具体情况的话估计会跟编译器有关~

Assembly code

OD中相应函数的代码

0040D438  |.  C745 FC 01000>mov     dword ptr [ebp-4], 1
0040D43F  |>  837D FC 0A    /cmp     dword ptr [ebp-4], 0A         //当前EIP位置
0040D443  |.  7F 2D         |jg      short 0040D472
0040D445  |.  8B45 FC       |mov     eax, dword ptr [ebp-4]
0040D448  |.  83E8 01       |sub     eax, 1
0040D44B  |.  8B4D FC       |mov     ecx, dword ptr [ebp-4]
0040D44E  |.  89448D D4     |mov     dword ptr [ebp+ecx*4-2C], eax     //此处将EAX中的9赋给了0012FF7C,替换掉了0A
0040D452  |.  8B55 FC       |mov     edx, dword ptr [ebp-4]
0040D455  |.  8B4495 D4     |mov     eax, dword ptr [ebp+edx*4-2C]
0040D459  |.  50            |push    eax                             ; /<%d>
0040D45A  |.  68 1C204200   |push    0042201C                        ; |%d
0040D45F  |.  E8 8C020000   |call    printf                          ; \printf
0040D464  |.  83C4 08       |add     esp, 8
0040D467  |.  8B4D FC       |mov     ecx, dword ptr [ebp-4]
0040D46A  |.  83C1 01       |add     ecx, 1
0040D46D  |.  894D FC       |mov     dword ptr [ebp-4], ecx
0040D470  |.^ EB CD         \jmp     short 0040D43F

0040D43F处为EIP时的提示信息如下:
堆栈 SS:[0012FF7C]=0000000A

相应地址中的数据
0012FF7C  0A 00 00 00 C0 FF 12 00 59 11 40 00 01 00 00 00  ....?.Y@....
0012FF8C  60 0C 38 00 F8 0C 38 00 28 02 93 7C FF FF FF FF  `.8.?8.(搢
0012FF9C  00 40 FD 7F 01 00 00 00 06 00 00 00 94 FF 12 00  .@?......?.
0012FFAC  3A 22 62 80 E0 FF 12 00 D0 26 40 00 20 20 42 00  :"b€?.?@.  B.

部分寄存器中各值
EAX    00000002
ECX    0000000A
EDX    00426F50
EBX    7FFD4000
ESP    0012FF08
EBP    0012FF80
ESI    FFFFFFFF
EDI    0012FF80

EIP    0040D43F

------解决方案--------------------
探讨
#define ARRAY_SIZE 10

void nutural_numbers(void)
{
int i;
int array[ARRAY_SIZE];

i = 1;

while(i<=ARRAY_SIZE)
{
array[i] = i - 1;
i = i + 1;
}
}
谁能告诉我这个函数为什么会死循环,调试中发现array[10](已越界)总是……

------解决方案--------------------
探讨
举一个溢出的例子:
本来buf 应该输出空的,但是结果不是,因为data溢出的数据覆盖了buf的数据:

C/C++ code
#include <iostream>
#include <string>
using namespace std;

int main()
{
char buf[30] = {0};
char data[1];

……