C语言 动态分配的 2D 空间的内存管理



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

最新更新