程序代码:1#include<stdio.h>2#include<stdlib.h>34voidbug()5{6system("reboot");7exit(0);89}10intstack_test(inta,intb)11{12//int*p=&a;13//p--;14//*p=bug;15printf("beforewrite:0x%x\n",b);16int*p=&a;17p++;18*p=0xdddd;19printf("afterwrite:0x%x\n",b);20intc=0xcccc;21returnc;2223}运行结果:beforewrite:0xbbbb;afterwrite:0xdddd;

分析结果:

因为栈是向下生长的并且由高地址向低地址,函数调用时参数从右向左压栈,

当第一次取b的地址时还是原来的,当指针p取到a的地址并向后加时,已经指向b,此时*p 改变b的地址

,所以after之后的地址为0xdddd。


如果放开注释过的内容,p--之后指向返回地址,将bug函数地址存入返回地址处,因此跳转到bug函数,会重启电脑。