局部变量的存储位置是在栈中,栈在内存中的特点是自上而下生长,也就是由高地址到低地址,当变量作为函数参数传递时为传值方式,函数形参作为接收方会开辟一块临时空间来拷贝实参的值,如下代码:
当main函数中调用函数stack_test时,将局部变量a,b传值过去,此时调试可得到a,b的存储位置
而后进入函数stack_test后,临时开辟了另一块空间来拷贝a,b的值,调试可得出
因此,形参和实参并不是同一回事,只是值相同而已,此时输出b,值应该为0xbbbb,而之后将a的地址赋给临时指针变量p,再将p进行自加,调试可得
因此将0xdddd赋值给指针p所指向的空间,就是将函数struct_test中的b值更改为0xdddd,但是main函数中的b值并没有改变,此时输出b值为0xdddd。
下面的程序:
运行程序会出现重启系统,因为函数bug中用了system("reboot");system函数会调用fork去创建一个子进程,函数stack_test中,调试可得
将函数bug的入口赋值给了指针变量p,
0x8048414转换成十进制就为*p所指向空间的值134513684,也就是将偏移量0x8048414赋给*p
当stack_test函数结束时会去调用bug函数
时间: 2024-10-20 08:27:09