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

时间:2017-10-18 23:20:27

标签: c malloc

大家: 我刚刚遇到一种在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;此致

1 个答案:

答案 0 :(得分:3)

第二个版本中的问题是你在int **而不是int *上进行指针运算,因为你有算术之外的强制转换。

for(i=0; i<rows; i++)
    array[i] =  ((int *)(array + rows) + i*cols);   // <--- the major difference