上图为程序的源文件通过编译器翻译得到可执行程序,可执行程序运行加载到内存的过程
然而程序在运行的过程中堆栈发生了什么呢?
首先我们需要了解栈
栈是向下生长的,由内存的高地址到低地址,栈顶的地址比栈低的地址低
寄存器ebp称为帧指针或基址指针,指向栈底
寄存器esp称为栈指针,指向栈顶
例题
#include <stdio.h>
void fun()
{
int tmp = 10;
int *p = (int *)(*(&tmp+1));
*(p-1) = 20;
}
int main()
{
int a =0;
fun();
printf("a = %d\n");
system("pause");
return 0;
}
结果为 20
分析如上图所示