这段时间把C++学完了顺带把C重学了一遍,有了汇编的基础后过去的很多疑惑都解开了,比如下面这道数组下标越界问题。
问题代码如下:
#include<stdio.h>
int Helloworld()
{
printf("HelloWorld");
return 0;
}
void Function()
{
int array[5]={1,2,3,4,5};
array[6]=(int)(Helloworld);
return;
}
int main()
{
Function();
return 0;
}
输出结果:
解析:按理来说数组下标越界是个非常明显的错误,但编译器不但给了通过,还把未被调用的Helloworld函数输出到了结果中,这是为什么呢?
原因是编译器将array[6]的地址翻译成EBP+4,并将Helloworld函数的地址存了进去。在Function函数调用完成堆栈平衡后取EBP+4地址到EIP从而执行了Helloworld函数。