二级指针的输入输出模型
指针做输入,是在主调函数中分配内存;指针做输出,是指在被调用函数中分配内存,通过指针做函数参数把运算结果返回给主调函数。
//指针做输出:求文件中的两段话的长度:
int getMem(char **myp1, int *mylen1, char **myp2, int *mylen2)
{
char *tmp1 = NULL;
char *tmp2 = NULL;
tmp1 = (char *)malloc(100);
if(tmp1 == NULL)
{return -1;}
strcpy(tmp1, "abcdefg");
*myp1 = tmp1;
//
tmp2 = (char *)malloc(100);
if(tmp2 == NULL)
{return -2;}
strcpy(tmp2, "11223344");
*myp2 = tmp2;
return 0;
}
int getMemFree0(char **myp) //二级指针可以释放掉内存,并将指向此内存的实参指针置为NULL
{
char *tmp = NULL;
if (myp == NULL)
{
return -1;
}
tmp = *myp;
free(tmp);
*myp = NULL;
return 0;
}
//
int getMemFree1(char *myp) //二级指针只可以释放掉内存,但不能将指向此内存的实参指针置为NULL,造成实参指针野指针现象。
{
char *tmp = NULL;
if (myp == NULL)
{
return -1;
}
tmp = myp;
free(tmp);
return 0;
//释放掉tmp即myp所指向的内存空间后,无法通过myp将实参置为NULL,因为此处myp的存储是实参的拷贝,和实参已无关系。
}
void main()
{
char *p1 = NULL;
int len1 = 0;
char *p2 = NULL;
int len2=0;
ret = getMem(&p1, &len1, &p2, &len2);
printf("p1: %s\n", p1);
printf("p2: %s\n", p2);
/*
// 在主调函数中进行时释放也是可以的:
if(p1!=NULL)
{
free(p1);
p1==NULL;
}
if(p2!=NULL)
{
free(p2);
p2==NULL;
}
*/
getMemFree0(&p1); //或者getMemFree1(p1);
getMemFree0(&p2); //或者getMemFree1(p2);
}