void fun(char *p)
{
p = malloc(32);
strcpy(p, "hello");
}
main()
{
char *m = NULL;
fun(m);
printf("%s\n", m);
}
运行结果:程序运行崩溃。
解释:
1.在main里,将m的值带到了函数fun里,但是在子函数fun里,与m没有任何联系,在main函数里打印m出来的还是m=NULL;
2.在使用malloc函数时,必须使用free函数进行堆区释放,然后将首地址置为NULL。
解决办法:
如果在子函数中开辟堆区空间,想在main函数拿到首地址有两种方式:返回值、地址传递。
1.通过返回值
//通过返回值p来将两个函数联系起来
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *fun()
{
char *p = (char *)malloc(32);//定义
strcpy(p,"hello");
return p;
}
int main()
{
char *m =fun();//p=m
printf("%s\n", m);
free(m);
m=NULL;
return 0;
}
2.地址传递
void fun(char **p) // p = &m //*p == m
{
*p = (char *)malloc(32); //m指向堆区空间首地址
strcpy(*p, "hello");
}
int main()
{
char *m = NULL;
fun(&m);
printf("%s\n", m);
free(m);
m = NULL;
return 0;
}