形参

看一个网上的题目, 我写了个控制台演示


#include "stdafx.h"
#include <stdlib.h>
#include <string.h>


void GetMemory(char* p)
{
 p=(char*)malloc(100);
}

int _tmain(int argc, _TCHAR* argv[])
{
 char* str=NULL;
 GetMemory(str);
 strcpy(str,"Hello World! hapyy brithday");
 printf(str);
 return 0;
}

结果:  程序抱错,哪里错了,对,看下汇编代码

.text:00401730 sub_401730      proc near               ; CODE XREF: _wmain+Fp
.text:00401730
.text:00401730 arg_0           = dword ptr  8
.text:00401730
.text:00401730                 push    ebp
.text:00401731                 mov     ebp, esp
.text:00401733                 push    64h             ; size_t
.text:00401735                 call    ds:malloc
.text:0040173B                 add     esp, 4
.text:0040173E                 mov     [ebp+arg_0], eax                     //分配的内存地址写入堆栈,呵呵
.text:00401741                 pop     ebp
.text:00401742                 retn
.text:00401742
.text:00401742 sub_401730      endp

再看形参如何传入的

.text:00401750 var_4           = dword ptr -4                        //       程序中的str
.text:00401750
.text:00401750                 push    ebp
.text:00401751                 mov     ebp, esp
.text:00401753                 push    ecx
.text:00401754                 mov     [ebp+var_4], 0               //    str=NULL
.text:0040175B                 mov     eax, [ebp+var_4]
.text:0040175E                 push    eax                                 //     压入堆栈, 其实就是push 0
.text:0040175F                 call    sub_401730

看明白了吗? 当初学C 的时候老搞不明白,哎,原来是.......

怎么解决呢?

 我们修改

void GetMemory(char*  &p)
{
 p=(char*)malloc(100);
}

 .text:00401730 sub_401730      proc near               ; CODE XREF: _wmain+Fp
.text:00401730
.text:00401730 arg_0           = dword ptr  8
.text:00401730
.text:00401730                 push    ebp
.text:00401731                 mov     ebp, esp
.text:00401733                 push    64h             ; size_t
.text:00401735                 call    ds:malloc
.text:0040173B                 add     esp, 4
.text:0040173E                 mov     ecx, [ebp+arg_0]           //跟上面的mov     [ebp+arg_0], eax  有什么不同
.text:00401741                 mov     [ecx], eax
.text:00401743                 pop     ebp
.text:00401744                 retn
.text:00401744
.text:00401744 sub_401730      endp

再看调用有什么不同

.text:00401750 var_4           = dword ptr -4
.text:00401750
.text:00401750                 push    ebp
.text:00401751                 mov     ebp, esp
.text:00401753                 push    ecx
.text:00401754                 mov     [ebp+var_4], 0
.text:0040175B                 lea     eax, [ebp+var_4]     // 地址压入堆栈,一个是mov ,一个是lea
.text:0040175E                 push    eax
.text:0040175F                 call    sub_401730

& 起的作用我想就是引用传值, 大概就是这个样子吧!?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值