多级指针

指针调用引申;

函数调用时,用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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容