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

标签 c malloc

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

关于c - 动态分配的 2D 空间的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46820639/

相关文章:

c - 如果您知道字符编码,您将如何从 C 语言的文本文件中读取,然后将其显示在控制台上?

c - 在 C 中声明一个 n 指针

c - C 中出现运行时错误

c++ - Valgrind 声称我在使用 new 时使用 malloc

c - 使用 free() 时获取核心转储

c - 我真的需要malloc吗?

c - 段错误(核心转储)C linux

c - 在 main 之外的函数中 malloc 一个大的二维字符串数组

c - 通过 Malloc 增加分配给结构的内存大小

c - 阅读 dict 文件找到 "words"并添加到 trie 中