二级指针和二维数组高手请进
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);
}
}
[解决办法]
你的代码错了不少。帮你改了下
// 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;}