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地址所在的内容,因而可能造成死循环
------解决方案--------------------
经典的内存分配的问题
------解决方案--------------------
------解决方案--------------------
假设I等于10时,循环成立,但array[i]处就变成了array[10],而因为数组下标是从0开始的,所以出现溢出,而编译器设置变量的地址时一般在代码中相邻的变量地址是在一起的,就是4楼说的那种情况!
刚在我的电脑上OD载入了一下这个单独的函数,发现变量I当变成10时不管跑几次都还是10,仔细看了下,溢出,在array[i] = i - 1;处将用于存放循环变量的i的地址处的10减了1,然后在最后循环跑完时又加上了一,所以,当I增加到10时,就一直变成了10,溢出也只溢出了这一个部分,其它的电脑上具体情况的话估计会跟编译器有关~
#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地址所在的内容,因而可能造成死循环
------解决方案--------------------
经典的内存分配的问题
------解决方案--------------------
------解决方案--------------------
假设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
------解决方案--------------------
------解决方案--------------------