今天面试第一题是这样的:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* GetPtr(char* p)
{
p = (char*)malloc(20);
strcpy(p,"string2");
return p;
}
int main(int argc,char** argv)
{
char* p1 = "string1";
char* p2 = GetPtr(p1);
printf("p1 = %s,\np2 = %s\n",p1,p2);
return 0;
}
结果自己做的和答案不一样,让我深深自责,质疑自己的指针功底,特地写着一片小文章,算做对自己的勉励。
答案是p1 = string,p2 = string2,为什么?长话短说,指针传递归根结底也是值传递,传个拷贝,指针传进去之后,形参成为一份指向这个地址的拷贝,然后对这个拷贝进行malloc,为它分配新地址,它自然是string2了,可是原来的实参我们根本就不能,都没有办法修改它的值。那以前为什么传指针可以呢,因为我们没有用malloc.
如何才能修改传进去的实参指针指向的内容呢?想想看,指针传进去产生一份指针拷贝,我们没法修改这个实参指针,因为你没有办法操作它,但是,如果传进去它的指针,也就是二级指针,那么虽然会产生二级指针的拷贝,但是,可以通过这个拷贝操作到一级指针,现在,好办了
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* GetPtr(char** p)
{
*p = (char*)malloc(20);
strcpy(*p,"string2");
return *p;
}
int main(int argc,char** argv)
{
char* p1 = "string1";
char* p2 = GetPtr(&p1);
printf("p1 = %s,\np2 = %s\n",p1,p2);
return 0;
}
形如这样。但是这似乎不太安全,因为原来的实参指针指向的内容你还没释放呢,如果它的资源是在堆上。