在 《C陷阱与缺陷》中,出现如下的代码:
#include <stdio.h> int main(int argc, char *argv[]) { int i = 0; int a[10]; for(i=0; i<=10; ++i) { a[i] = 0; // 死循环 } return 0; }
作者的解释是:如果用来编译这段程序的编译器按照内存地址递减的方式来给变量分配内存,那么最后将赋值给变量 i ,陷入死循环。
将程序在VC6.0 运行,查看反汇编代码:
从结果中,可知内存的分配结果是按照地址递减的方式给变量分配内存的:
结果中,a[i] = 0 的反汇编代码是 mov dword ptr [ebp+ecx*4-2Ch], 0
其中 ecx 是 i 的数值,ebp - 2CH = ebp - 44, 实际上就是 a[0] 的位置, i 占4个字节,a[10]占40个字节, 共44个字节。
mov dword ptr [ebp+ecx*4-2Ch], 0 也即是 mov dword ptr [ebp-2Ch+ecx*4], 0
就是在a[0] 的地址上,每次加上 i 个单位的整数地址(4个字节)
当最后一个数值 i = 10 的时候, 变成了 mov dword ptr [ebp - 4], 0, 实际上就是给 i 赋值,这条语句就是第一个断点位置的反汇编代码,自然的,i 又被重新赋值为0, 陷入了死循环。
这是自己第一次使用反汇编来调试程序,简单记录 。
时间: 2024-10-13 14:28:34