2017-10-18 72 views
2

everyone: 我刚刚遇到了一种在C中分配二维矩阵的方法。在练​​习时,我对一个未知的bug感到困惑。动态分配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 

这似乎是一些内存错误。但我无法弄清楚这个问题。 任何人都可以帮我吗?

感谢&问候

+0

你如何写你释放空间的代码行? –

+0

'array'是'int **'。 'array_head'是'int *'。两者都不同。 – BLUEPIXY

+0

你真的打算返回一个指向int指针的指针吗?在中,你在寻找一个int指针数组吗? – jwdonahue

回答

3

在第二个版本的问题是,你正在做上int **而不是int *指针运算,因为你有算术外投。

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

嗨,巴尔马,你是对的,谢谢你指出的问题。 – MyCoy