小郭学C语言(一)

本文通过分析C语言在VC6Debug环境下函数调用的堆栈操作,探讨了如何在test函数中影响main函数的变量m。通过汇编代码,解释了堆栈分配、局部变量的存储以及函数调用时的堆栈变化,展示了如何找到变量m相对于变量t的地址偏移。
摘要由CSDN通过智能技术生成
 

问题:

如何在下面的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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值