看一个网上的题目, 我写了个控制台演示
#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
& 起的作用我想就是引用传值, 大概就是这个样子吧!?