【发布时间】:2017-10-18 23:20:26
【问题描述】:
大家: 我刚刚遇到了一种在 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
这似乎是一些内存错误。但我无法弄清楚问题所在。 谁能帮帮我?
感谢和问候
【问题讨论】:
-
如何编写释放空间的代码行?
-
array是int**。array_head是int*。两者都不一样。 -
你真的打算返回一个指向 int 指针的指针吗?比如,你在寻找一个 int 指针数组吗?
-
所以它就像一个矩阵,实现为一个指向行的指针数组,但它确保行彼此和指针数组是连续的。
-
我在这个设计中看到的唯一价值是它对局部性有好处,你可以通过一个电话
free()来释放整个东西。