everyone:我刚刚遇到了一种在 C 中分配 2D 矩阵的方法。在练习它时,我对一个未知的错误感到困惑。
这是函数,第一个版本:
//first version
static int ** my2DAlloc(int rows, int cols){
int ** array;
int * array_head;
int i;
int len = sizeof(int*)*rows + sizeof(int)*rows*cols + 1;
array = (int**)malloc( len );
memset(array, 0, len);
array_head = (int *) (array + rows);
for(i=0; i<rows; i++)
array[i] = array_head + i*cols ;
return array;
}
我对这个版本没有任何问题。但是,我尝试稍微更改代码,如下所示:
//second version
static int ** my2DAlloc(int rows, int cols){
int ** array;
int * array_head;
int i;
int len = sizeof(int*)*rows + sizeof(int)*rows*cols + 1;
array = (int**)malloc( len );
memset(array, 0, len);
//array_head = (int *) (array + rows);
for(i=0; i<rows; i++)
array[i] = (int *) (array + rows + i*cols); // <--- the major difference
return array;
}
关于第二个版本,将数据写入矩阵并读出数据似乎很好。但是当我尝试释放分配的空间时,我收到系统错误,例如:
free(): invalid next size (fast): 0x00000000020df010
似乎是一些内存错误。但是我无法弄清楚问题所在。谁能帮我?
感谢和问候
第二个版本中的问题是你在int **
而不是int *
上做指针算术,因为你在算术之外有强制转换。
for(i=0; i<rows; i++)
array[i] = ((int *)(array + rows) + i*cols); // <--- the major difference