问题:
如何在下面的test函数里加入代码可以使程序运行起来输入和输出的相等?
(环境是vc6Debug方式下)
#include<stdio.h>
void test()
{
int t;
scanf("%d",&t);
在这里加入代码
}
main()
{
int m;
test();
printf("m=%d",m);
}
要在test函数中加入代码,影响main函数里面的变量,很明显我们要加的代码是一个赋值语句,语句的右值是我们输入的t的值,而左值,则是test函数里t变量的地址加上main函数里m变量的地址相对于t变量的偏移的值。
那么问题的实质,就转变为变量m的地址相对于变量t地址的偏移了。
这个偏移如何求?
基础知识:
让我们跳出这个题,看看我们手头掌握的知识。
函数调用需要用到堆栈,当程序调用函数时,C将函数调用后面的指令地址(称为返回地址)压入堆栈。然后,C将函数的参数从右至左依次压入堆栈。最后,如果函数声明了局部变量,C将堆栈空间分配给函数以存储变量的值。
当函数结束的时候,C释放存储局部变量和参数的堆栈空间。然后,C根据返回地址判断下一步要执行的指令。C从堆栈中移走返回值并将地址放入IP寄存器中。
函数调用的堆栈示意图如下图所示:
需要说明的是,什么是堆栈呢?我们都知道,变量、常量在内存中的分配大致分成四个区域,分别是堆栈、堆、常数存储区以及全局、静态存储区。分配在堆栈中的变量具有的最主要的特点就是当这个变量不再需要的时候,编译器会自动回收,函数内的局部变量的存储单元都可以在栈上分配。
实际上,堆栈是系统内存中的一块区域,这个区域在操作系统初始化时得到分配。
探究本题:
由堆栈的知识,我们知道了,test函数里的t