读书人

二级指针和二维数组

发布时间: 2012-09-12 09:21:30 作者: rapoo

二级指针和二维数组高手请进
int get_mem2D(byte **array2D, int rows, int columns)
{
int i;
/* 高手帮我看看下面这两个malloc是什么意思啊都*/
if((*array2D = (byte**)malloc(rows*sizeof(byte*))) == NULL) //这里为什么是*array2D(有个*),为什么是两个* (byte**),sizeof(byte*)这又是什么意思 exit(2);

/*下面这句对应的三个部分又都是什么意思*/
if(((*array2D)[0] = (byte* )malloc(columns*rows*sizeof(byte ))) == NULL)
exit(2);

/*这个循环有必要吗*/
for(i=1;i<rows;i++)
(*array2D)[i] = (*array2D)[i-1] + columns ;

return rows*columns;
}

void free_mem2D(byte **array2D)
{
if (array2D)
{
if (array2D[0])
free (array2D[0]);
else exit(6);

free (array2D);
} else{
exit(6);
}
}


[解决办法]
你的代码错了不少。帮你改了下

C/C++ code
// array2D 是一个指针,它指向一个数组,该数组的每个元素为一个指针,他指向每行的起始地址。int get_mem2D(byte **&array2D, int rows, int columns)  // 传引用byte **&array2D。 这才是给你传入指针分配空间。{    int i;  // 给 行指针 分配空间。这里并不是给二维数组元素分配空间。  if((array2D = (byte**)malloc(rows*sizeof(byte*))) == NULL)   {        return 0;  }  // 这里才是给二维数组分配空间  byte *p;   if((p = (byte*)malloc(columns*rows*sizeof(byte))) == NULL)  {    return 0;  }  /*每个 行指针 指向正确的位置。就是行起始的位置*/  for(i=0;i<rows;i++)  {    array2D[i] = p;    p += columns; //p指向下一行位置。  }  return rows*columns;}// 也应该传引用,并把指针指向NULL。传值的话,就在外面指向NULLvoid free_mem2D(byte **&array2D) {  if (array2D)  {  //释放二维byte数组空间  if (array2D[0])  free (array2D[0]);  else exit(6);  //释放一维 行指针 数组的空间   free (array2D);  } else{  exit(6);  }  array2D = NULL;}int main(int argc, char *argv[]){    int r,c,x;    byte **p;    get_mem2D(p, 2, 3);    x = 1;    for(r = 0; r < 2; r++)        for(c = 0; c < 3; c++)        {            p[r][c] = x++;        }    for(r = 0; r < 2; r++)    {        for(c = 0; c < 3; c++)        {            printf("%d  ", p[r][c]);        }        printf("\n");    }    free_mem2D(p);    return 0;} 

读书人网 >C语言

热点推荐