在C++里面,指针是一种比较麻烦的操作,但是我们又不得不用.因为他给我们编程以很大的灵活性
下面我讲以下指针作为函数参数时的问题
在函数参数中,编译器总是要为函数的每个参数制作临时副本,指针
参数p 的副本是 _p,编译器使 _p = p 。如果函数体内的程序修改了_p 的内容,就导致
参数p 的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p 申请
了新的内存,只是把_p 所指的内存地址改变了,但是p 丝毫未变。
以上是林锐博士在高质量C++编程中的描述
下面我们结合描述给出调试CODE
Example Code:
void GetMemory(char *p,int num)
{
p = (char*)malloc(sizeof(char)*num);
// return
}
void main()
{
char *str = NULL;
GetMemory(str,100);
strcpy(str,"Hello World");//出错
}
首先我们先看看asm
004010B8 mov dword ptr [ebp-4],0
004010BF push 64h
004010C1 mov eax,dword ptr [ebp-4]
004010C4 push eax
004010C5 call @ILT+50(GetMemory) (00401037)
str 地址:12FF7C
其副本地址:12FF28
在存入参数的时候,同时都指向00 00 00 00
在执行p = (char*)malloc(sizeof(char)*num);之后
12FF28指向的内容变成了20 1C 43 00了.
林锐博士在这边的意思是只用指向指针的指针,这种方法我们在第二种方法种介绍,
下面给出我的一种看法,大家觉得好不好
我的方法:
char *GetMemory(char *p,int num)
{
p = (char*)malloc(sizeof(char)*num);
return p;
}
void main()
{
char *str = NULL;
str = GetMemory(str,100);
strcpy(str,"Hello World");
cout<<str<<endl;
}
可以简化为:
char *GetMemory(int num)
{
char *p = (char*)malloc(sizeof(char)*num);
return p;
}
void main()
{
char *str = NULL;
str = GetMemory(100);
strcpy(str,"Hello World");
cout<<str<<endl;
}
林锐博士的看法:
void GetMemory(char **p,int num)
{
*p = (char*)malloc(sizeof(char)*num);
}
void main()
{
char *str = NULL;
GetMemory(&str,100);
strcpy(str,"Hello,World");
cout <<str<<endl;
}