【问题标题】:Dynamically allocating and _freeing_ two-dimensional double array动态分配和_freeing_二维双数组
【发布时间】:2012-02-12 05:02:41
【问题描述】:

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

#define M 5
#define N 3

double **create_matrix(int m, int n);
void    destroy_matrix(double **matrix, int m);

int main(void)
{
  int i = 0, j = 0;
  int x = 0;
  double **matrix;

  matrix = create_matrix(M, N);

  while (i < M) {
    j = 0;
    while (j < N) {
      printf("%4.0f", *(*(matrix + j) + i) = j);
      j++;
    }
    putchar('\n');
    i++;
  }

  destroy_matrix(matrix, M);

  return 0;
}

double **create_matrix(int m, int n)
{
  int i = 0;
  double **matrix;

  if ((matrix = (double **) malloc(sizeof(double *) * m)) != NULL) {
    while (i < m)
      if ((*(matrix + i++) = (double *) malloc(sizeof(double) * n)) == NULL)
        return NULL;

    return matrix;
  } else
    return NULL;
}

void destroy_matrix(double **matrix, int m)
{
  int i = 0;

  while (i < m)
    free((void *) *(matrix + i++));

  free((void *) matrix);
}
  • 分配、初始化和打印矩阵作品。
  • 分配,而不是初始化和释放作品。
  • 分配、初始化和释放不起作用。

回溯:

*** glibc detected *** [file]: free(): invalid next size (fast): 0x0000000001e7d040 ***

接着是内存映射。

我搜索了类似的问题,但找不到适合我情况的问题,也无法从中得出我的问题。

【问题讨论】:

  • 顺便说一句,stackoverflow.com/questions/1733881/… 是完全相同的问题,尽管考虑到您经过测试并认为释放有效,但我可以理解这种困惑。至少,该链接包含一些您可能会发现有用的代码
  • 虽然不是完全 ...没有初始化,事实证明,这是问题所在。

标签: c


【解决方案1】:

您的矩阵分配和释放函数对我来说看起来不错。 但是矩阵元素的初始化有错误:

  while (i < M) {
    j = 0;
    while (j < N) {
      printf("%4.0f", *(*(matrix + j) + i) = j);
      j++;
    }
    putchar('\n');
    i++;
  }

这个表达式

*(*(matrix + j) + i)

必须被这个表达式改变

*(*(matrix + i) + j)

因为i 是您的行,j 是您的列。

请注意,您还可以在程序中使用更简单的matrix[i][j],它等同于*(*(matrix + i) + j)

【讨论】:

  • 愚蠢的我!我相互更改了循环变量并搞砸了……;(谢谢!
  • @enlightened 不客气。这是处理矩阵时非常常见的错误。
【解决方案2】:

您正在释放取消引用,即数组内容指向的地址。试试这个。请注意第 6 行的 '(matrix + i++) 之前缺少 '*'

void destroy_matrix(double **matrix, int m)
{
  int i = 0;

  while (i < m)
    free((void *) (matrix + i++));

  free((void *) matrix);
}

【讨论】:

  • 但是如果matrix是一个指向指针数组的指针,那么每一行肯定至少有一个解引用吗?
  • 指针是整数,您的+ i++ 与说 matrix[i] 相同,这已经是一个取消引用
  • 想一想,我不记得是否以这种方式进行指针运算考虑了类型大小...您甚至可能需要显式地将 i 乘以 sizeof(double*)
  • 我认为需要取消引用一次。没有,它给了我:free(): invalid pointer。我现在要尝试显式乘法...
  • 所以我刚刚写了一个快速测试程序,指针算术做了明智的事情,即 +1 添加 sizeof(指针类型),不管使用的运算符(加法、前置增量、后置增量)。很抱歉,指针不是整数类型严格意义上的整数。然而它们是整数,如果你像你一样做指针算术,可以被认为是整数(在数学意义上)
猜你喜欢
  • 1970-01-01
  • 2021-02-03
  • 2013-11-24
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多