//指针做输出 被调函数分配内存
//指针做输入 主调函数分配内存
二级指针做输出模型
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int getMem(char** myp1/*out*/, int*mylen1/*in*/, char**myp2/*out*/, int*mylen2/*in*/)
{
char*tmp1 = NULL;
tmp1 = (char*)malloc(100);
if (tmp1==NULL)
{
return -1;
}
strcpy(tmp1,"abcdefg");
*mylen1 = strlen(tmp1);
*myp1 = tmp1; //间接修改实参p1的值 myp1是个二级指针 通过*来改变它所指向一级指针的值(也就是一级指针的指向)
char*tmp2 = NULL;
tmp2 = (char*)malloc(100);
if (tmp2 == NULL)
{
return -2;
}
strcpy(tmp2, "a11112246");
*mylen2 = strlen(tmp2);
*myp2 = tmp2; //间接修改实参p1的值
return 0;
}
void getMemFree(char** myp)
{
/*if (myp == NULL)
{
return;
}
free(*myp); //释放完指针变量所指向的内存空间后
*myp = NULL;//在把指针变量置NULL
*/
char*tmp = NULL;
if (myp == NULL)
{
return;
}
tmp = *myp;
free(tmp); //释放完指针变量所指向的内存空间后
*myp = NULL;//在把实参指针变量置NULL
//在输出的时候 通过二级指针可以把实参一级指针置NULL 能够很好避免野指针的出现
return;
}
void main()
{
char* p1 = NULL;
int len1 = 0;
char* p2 = NULL;
int len2 = 0;
int ret = 0;
ret = getMem(&p1, &len1, &p2, &len2);
if (ret != 0)
{
printf("getMem err");
return ;
}
printf("P1: %s\n",p1);
printf("P2: %s\n", p2);
getMemFree(&p1);
getMemFree(&p2);
printf("\nhehhe");
system("pause");
return;
}
如果用一级指针做释放函数的参数时候:
void getMemFree0(char* myp)
{
if (myp == NULL)
{
return;
}
free(myp); //释放完指针变量所指向的内存空间后
myp = NULL;//这个只能把形参指针置为NULL 实参指针不能置NULL 所以实参仍然是个野指针
return;
}
main函数调用
void main12()
{
char* p1 = NULL;
int len1 = 0;
char* p2 = NULL;
int len2 = 0;
int ret = 0;
ret = getMem(&p1, &len1, &p2, &len2);
if (ret != 0)
{
printf("getMem err");
return;
}
printf("P1: %s\n", p1);
printf("P2: %s\n", p2);
//实参指针仍然为野指针
getMemFree0(p1); //在被调用函数中 把p1所指向的内存给释放掉 但是这样实参p1并不能在被调用函数中置NULL
getMemFree0(p2);
printf("\nhehhe");
system("pause");
return;
}
但是在函数执行后可以采取这种方法:
if (p1 != NULL)
{
free(p1);
p1 = NULL;
}
if (p2 != NULL)
{
free(p2);
p2 = NULL;
}