局部变量的存储位置是在栈中,栈在内存中的特点是自上而下生长,也就是由高地址到低地址,当变量作为函数参数传递时为传值方式,函数形参作为接收方会开辟一块临时空间来拷贝实参的值,如下代码:

Linux平台下变量在栈帧中的存储_第1张图片


当main函数中调用函数stack_test时,将局部变量a,b传值过去,此时调试可得到a,b的存储位置

Linux平台下变量在栈帧中的存储_第2张图片

而后进入函数stack_test后,临时开辟了另一块空间来拷贝a,b的值,调试可得出

因此,形参和实参并不是同一回事,只是值相同而已,此时输出b,值应该为0xbbbb,而之后将a的地址赋给临时指针变量p,再将p进行自加,调试可得

Linux平台下变量在栈帧中的存储_第3张图片

因此将0xdddd赋值给指针p所指向的空间,就是将函数struct_test中的b值更改为0xdddd,但是main函数中的b值并没有改变,此时输出b值为0xdddd。


下面的程序:

Linux平台下变量在栈帧中的存储_第4张图片

运行程序会出现重启系统,因为函数bug中用了system("reboot");system函数会调用fork去创建一个子进程,函数stack_test中,调试可得

Linux平台下变量在栈帧中的存储_第5张图片

将函数bug的入口赋值给了指针变量p,

wKiom1b-ZdnR2iMhAAAT4xFmmzE287.png

0x8048414转换成十进制就为*p所指向空间的值134513684,也就是将偏移量0x8048414赋给*p

当stack_test函数结束时会去调用bug函数

Linux平台下变量在栈帧中的存储_第6张图片