大家: 我刚刚遇到一种在C中分配2D矩阵的方法。在练习它时,我对一个未知的bug感到困惑。
这是函数,第一个版本:
//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
这似乎是一些内存错误。但我无法弄清楚问题所在。 谁能帮助我?
谢谢&amp;此致
答案 0 :(得分:3)
第二个版本中的问题是你在int **
而不是int *
上进行指针运算,因为你有算术之外的强制转换。
for(i=0; i<rows; i++)
array[i] = ((int *)(array + rows) + i*cols); // <--- the major difference