多級指針

指針調用引申;

函數(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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容