动态分配二维数组以及二维数组传参
如下:本程序是通过调用zone_read,将数据存入ethinfo输出参数中的
需调用buf_read两次,第一次获得一维大小,然后动态分配空间,再次调用buf_read得以将数据存入动态分配的堆中
*********************************************************
int buf_read(char *buf_name,char **info)
{
if(info==NULL) return 5; //返回一维的大小
if(info!=NULL)
{
strcpy(*info,"eth1");
strcpy(*(info+1),"eth2");
strcpy(*(info+2),"eth3");
strcpy(*(info+3),"eth4");
strcpy(*(info+4),"eth5");
}
return 5;
}
int main(int argc,char *argv[])
{
//已知二维的大小为10;
int n=0,i;
char *p,**q;
n=buf_read("hello",NULL); //获取一维的大小
第一种方法分配内存:
--------------------------------------------
q =(char **)malloc(n*sizeof(char *));
for(i=0;i<n;i++)
q[i]=(char *)malloc(10);
———————————————————————————————————————————-
第二种方法分配内存:
----------------------------------------------
q =(char **)malloc(n*sizeof(char *));
p =(char *)malloc(n*10);
for(i=0;i<n;i++)
q[i]=p+(i*10);
----------------------------------------------
第三种方法分配内存:
----------------------------------------------
q =(char **)malloc(n*10+n*sizeof(char *));
p=(char *)q+n*sizeof(char *);
for(i=0;i<n;i++)
q[i]=p+(i*10);
----------------------------------------------
buf_read("hello",q);
for(i=0;i<n;i++)
{
printf("%s:/n",q[i]);
printf("%c:/n",q[i][3]);
}
free(q);
return 0;
}
个人总结:
第一种方法的空间分散,且手动分配的次数较多,就存储结构,程序性能,已经健壮性都不如其他两种方法
第二种方法的空间也不连续,虽然只有两片区域,相对第一种方法方便了不少
第三种方法只分配了一次空间,存储空间连续,相对来说是最好的一种方法
此三种方法都可通过q[i],q[i][j]来调用一维和二维的元素
此程序经过测试raindy