【问题标题】:memory management for a dynamically allocated 2D space动态分配的 2D 空间的内存管理
【发布时间】: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

这似乎是一些内存错误。但我无法弄清楚问题所在。 谁能帮帮我?

感谢和问候

【问题讨论】:

  • 如何编写释放空间的代码行?
  • arrayint**array_headint*。两者都不一样。
  • 你真的打算返回一个指向 int 指针的指针吗?比如,你在寻找一个 int 指针数组吗?
  • 所以它就像一个矩阵,实现为一个指向行的指针数组,但它确保行彼此和指针数组是连续的。
  • 我在这个设计中看到的唯一价值是它对局部性有好处,你可以通过一个电话free()来释放整个东西。

标签: c malloc


【解决方案1】:

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

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

【讨论】:

  • 嗨,Barmar,你是对的,感谢您指出问题。
猜你喜欢
  • 2013-11-21
  • 2013-11-06
  • 2012-10-23
  • 2013-01-27
  • 2012-11-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多