首先给出错误代码:
void fun2(char* p)
{
p = malloc(100);
strcpy(p, "hello world!");
}
void fun1()
{
char* p = NULL;
fun2(p);
printf("%s\n", p);
}
问题:
代码中的fun1为主调函数,fun2为被调函数,主调函数内p指针为空指针, p传入被调函数中是值传递而非引用传递,在被调函数结束后对p的操作都会消失,因此p最终仍然指向的是NULL而不是字符串“hello world”
解决方法:
1.若想正确传参,在C语言中需要二级指针来实现,把p的地址传入被调函数再解引用即可,正确代码如下:
void fun2(char** p)
{
*p = (char *)malloc(100);
strcpy(*p, "hello world!");
}
void fun1()
{
char* p = NULL;
fun2(&p);
printf("%s\n", p);
}
2.或者在主调函数中提前为指针p开辟内存,也可正确传参,正确代码如下:
void fun2(char* p)
{
strcpy(p, "hello world!");
}
void fun1()
{
char* p = malloc(100);
fun2(p);
printf("%s\n", p);
}