本人最近做了几道面试题,都是关于内存传递的,这一块内容经常出现在面试题中,所以做了一些总结,其中不足之处,还望各位大神多多指教
先来看一段程序:
<span style="white-space:pre"> </span>void GetMemory(char *p)
{
p=(char *)malloc(100);
}
void Test(void)
{
char *str=NULL;
GetMemory(str);
strcpy(str,"hello world");
printf(str);
}
问:这个程序会出现什么问题?
答案:GetMemory()中申请的空间并没有传到Test()函数中,str没有空间,无法使“hello world”复制到str中,出现段错误。
那么如何使内存传递到Test的str中呢?什么原理呢?
有两种方法可以达到上述目的.
第一种方法:
<span style="white-space:pre"> </span>void GetMemory(<u>char **p</u>)
{
<u>*p=(char *)malloc(100);</u>
}
void Test(void)
{
char *str=NULL;
<u>GetMemory(&str);</u>
strcpy(str,"hello world");
printf(str);
}
我们是使用二维指针来完成内存的传递,char **p是二级指针,p中存放的是str的地址,*p=str;*p=(char *)malloc(100),直接针对str的地址进行申请内存,这样就在GetMemory中,成功对str申请了内存。其中,本人认为*p就是str的另外一种表达方式而已,完全与str等同,地址和内容完全相同,假设*p不是完全等同,那么*p进行malloc后,指向也有了改变,str指向并没有变,那么*p有空间后,str不应该也得到了内存,与最后执行结果不符,所以本人认为i,*p只是str的另一种表达方式。
第二种方法:
<span style="white-space:pre"> </span>char* GetMemory(char *p)
{
p=(char *)malloc(100);
<span style="white-space:pre"> </span>return p;
}
void Test(void)
{
char *str=NULL;
str=GetMemory(str);
strcpy(str,"hello world");
printf(str);
}
这种解决内存传递的方法十分直接,直接将内存返回给str。下面我来解释一下这个原理:char *p这个指针代表的是p的指向和str指向一致,在GetMemory中,p得到了一块内存地址,然后经过return p,把p中存放的内存地址赋给str,str指向一块p赋给的内存地址,于是就有了内存。这种方法用比较直观的方式完成了内存的传递。
一点小心得,如果有不足之处,欢迎大神批评指出!共同进步!