指針調用引申;
函數(shù)調用時,用n級指針(形參)去間接改變n-1級指針(實參)的值,即可用三級指針改變二級指針的值。
三級指針做函數(shù)形參改造第三種內存模型調用,1、改造內存開辟函數(shù),使用指針做函數(shù)參數(shù)返回內存地址而非函數(shù)返回值return返回指針地址;改造內存釋放函數(shù),更好避免實參野指針現(xiàn)象;
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