指针调用引申;
函数调用时,用n级指针(形参)去间接改变n-1级指针(实参)的值,即可用三级指针改变二级指针的值。
三级指针做函数形参改造第三种内存模型调用,1、改造内存开辟函数,使用指针做函数参数返回内存地址而非函数返回值return返回指针地址;改造内存释放函数,更好避免实参野指针现象;
char **getMem_aborted(int num)
{
int i=0;
char **p2=NULL;
p2=(char **)malloc( num * sizeof(char *) );
if(p2==NULL)
{
return NULL;
}
for (i=0;i<num;i++)
{
p[i]=(char *)malloc( sizeof(char) * 100);
sprintf(p[i], "%d%d%d", i+1, i+1, i+1);
}
return p2;
} //getMem_aborted end
void getMem(char ***p3, int num)
{
int i=0;
char ** tmp=NULL; //先用临时变量分配内存。分配完后,在间接赋值给实参
if(p3==NULL)
{
return -1;
}//p3==NULL?
tmp= (char **) malloc(sizeof(char *) *num);
if(tmp==NULL)
{
return NULL;
}
for(i=0;i<num;i++)
{
tmp[i]=(char *)malloc(sizeof(char)*100); //char buf[100]
sprintf(tmp[i], "%d%d%d", i+1, i+1, i+1);
}
*p3=tmp;
return 0;
} // getMem end
void getMemFree(char ***p3, int num)
{
int i=0;
char **tmp=NULL;
if(p3==NULL)
{
return;
}
tmp=*p3;
for (i=0; i<num; i++)
{
free(tmp[i]);
tmp[i]=NULL;
}
free(tmp);
// tmp=NULL; //错误用法!!指针变量 和 它指向的内存空间或指向的变量 是两个概念。此处tmp==NULL,但*p3即实参依然是野指针。
*p3==NULL; //把实参赋值成null
} // getMemFree end
void main()
{
int i=0;
int num=5;
char **p2 = NULL;
getMem(&p2, num);
for (i=0; i<num; i++)
{
printf("%s \n", p2[i]);
}
getMemFree(&p2, num);
return;
}// main end