从汇编层面解析一传值操作

  C语言代码如下:
#include <stdlib.h>
#include "stdafx.h"
#include "stdio.h"
#include <string.h>
#include <malloc.h>
 
void GetMemory(char * & pBuf,int Bufsize){
    pBuf=(char *)malloc(sizeof(char)*Bufsize);
    memset(pBuf,0x00,Bufsize);
}
 
void main(int argc,char * argv[])
{
    char * pszBuf=NULL;
    GetMemory(pszBuf,50);
    strcpy(pszBuf,"h");
    printf ("%s\n",pszBuf);
 
    printf ("hello world!\n");
}
  上面代码中,pszBuf是指针,GetMemory函数的第一个参数pBuf也是指针,它加了个&,程序才能正常运行下去,为什么呢?猜测&起引用的作用。从汇编方面看。
  在GetMemory行加上断点(VC6.0),点击F5执行。可知它先存储参数50,再存入参数pszBuf的地址。如下图所示。

 

  进入GetMemory函数中。根据函数调用知识,可知【ebp+0Ch】存储的是第二个参数50。【ebp+8】存储的是第一个参数即指针pszBuf的地址,如下图所示。0019ff3c是pszBuf指针的地址,它存储的00431290即此指针指向的内存。

 

  接下来是初始化语句。此时已经将pszBuf指向的地址联系到分配的地址块中,所以顺利初始化。

 

  返回到主函数中,可知在执行strcpy函数时,压入的第一个参数是待存入字符串“h”。另一个参数是已初始化内存块的首地址,即pszBuf指向的地址。如下图所示。

 

  好,此时可猜测知pBuf和pszBuf都是指针,但通过“&”,pBuf变成了pszBuf的引用,即成为它的别名,那对它操作就等同于对pszBuf操作,愉快地结束。
 
知识点总结:
函数的参数定义中的【&】是引用的意思,它可以设置普通变量的引用,也能设置指针的引用。
 
 

posted on 2019-01-21 15:01  HYWZ  阅读(173)  评论(0编辑  收藏  举报

导航