动态分配和_freeing_二维双数组

时间:2012-01-17 11:27:25

标签: c

这是我的代码:

#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 ***

后面是记忆图。

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

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

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

  free((void *) matrix);
}