我对一个程序的分析(发现VC++的错误)
2011-12-24 16:15
337 查看
以下面程序分析入手:
int main()
{
int a[5]={1,2,3,4,5};
int *ptr1=(int*)(&a+1);
int *ptr2=(int*)((int)a+1);
printf("%x,%x",ptr1[-1],ptr2);
return 0;
}
下面用两种方法分析,第一,用理论分析;第二,在VC++6.0上调试,看结果。
第一,理论分析:
先看&a+1:对数组a的首地址,该地址的值加上sizeof(a)的值,即&a+5*sizeof(int),即下一个内存快的地址,也就是数组所在这块内存后面的那块的首地址(这个地址我们不知道是什么)。然后把这个地址强制转换为int型的指针,把这个指针赋给指针型变量ptr1.
下面分析ptr1[-1],ptr1[-1]= *(ptr1 - 1),(因为ptr1本身是指针变量,所以可以用作数组名)。由于ptr1是指针,指向数组a后面的下一个元素,而ptr1-1就是ptr1这个指针往前移动一个单位,移动之后这个指针指向了数组a的最后一个元素。显然,很正确。故*(ptr1-1)=5,显然,很正确。%x打印的是int型的值,即ptr1[-1]的值,即5。很正确。(实际上对于%x我不太明白)
下面分析ptr2:首先,a是数组首元素的首地址,(int)a即把这个地址强制转换为int型数据,然后(int)a+1很简单,就是int型数据的相加。(int*)((int)a+1)就是再把这个int型的数据再强制型转换为int类型的指针,最后再把这个指针赋给int型的ptr2指针。很简单。最后把这个指针给打印出来(以16进制数表示)。
第二,上面的理论分析很成熟,下面看在VC++6.0上的调试结果:
int main()
{
int a[5]={1,2,3,4,5}; //a[5]=1245120。 a=0x0012ff6c(首地址),&a+1=0x0012ff6d,
//&a+2=0x12ff6e,
int *ptr1=(int*)(&a+1); //a+1=0x0012ff70,a+2=0x0012ff74,
int *ptr2=(int*)((int)a+1); //ptr1=0x0012ff80,ptr2=0x0012ff6d
printf("%x,%x",ptr1[-1],ptr2);
return 0;
}
调试情况大致正确,并且调试的最终结果和理论分析的最终结果是一样的。有一个疑问是,&a+1本来是数组所在这块内存后面的那块的首地址,但是调试器给出的却是错误的,或者我个人认为调试器把&a+1认为是&a直接加上int型的1,这样分析就正确。
其他的都比较正确,感觉这也是编译器的一个bug吧。
相关文章推荐
- 解决vc++DEBUG ERROR问题前几天师弟调试程序的时候出现了这样一个错误,出错的位置是在delete [] 一个动态分配的数组时出现的。 经过调查发现错误是因为他之前在给数组赋值的时候越界了
- 转:解决VC2005程序的一个运行错误“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”
- VC2005程序的一个运行错误 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。
- 发现了Windows自带的一个很有用的程序分析工具
- 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序
- VC2005程序的一个运行错误 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。
- VC编译下对一个超简单的缓冲区溢出程序的原理解析以及c程序的汇编分析
- 对一个长度为100000条指令的程序进行集成测试期间记录如下面的数据: (A)7月1日集成测试开始没有发现错误 (B)8月2日总共改正了100个错误,此时MTTF=0.4H (C)9月1日:总共改正3
- 发现中文版《C Primer Plus第五版》示例程序的一个错误
- vb窗体程序调用vc ATl写的com组建一个小发现
- 解决VC2005程序的一个运行错误“由于应用程序的配置不正确,应用程序未能启动"
- 安装程序无法创建一个DCOM用户帐号来注册 VC 安装 错误
- VS或VC调用matlab程序dll路径配置及错误分析
- \t\t同一个程序,在VC6有错误和VS2005没有问题
- 现在为了让程序兼容vista,我们需要给程序加上一个manifest文件,可是有时候vc6它就会弹出Resource Compiler Error RC2170 的错误,可能是vc6一个bug,我个人对vc6还是很喜欢的,不过经常会有编译死掉或出错的问题,
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 用VC2013编译了一个程序,在Windows 8、Windows 7(64位、32位)下都能正常运行。但在Win XP,Win2003下运行时,却报错不能运行
- Python源码分析2 - 一个简单的Python程序的执行
- VC++创建一个Windows窗口程序
- 分析一个程序