首页 > 解决方案 > 返回 NULL 指针

问题描述

我有释放结构的功能:

typedef struct matrix_t {
  int r; // num of rows
  int c; // num of cols
  int *values;
} matrix_t;

这样做的功能是:

void deallocate_matrix(matrix_t **ptr) {
  if (ptr != NULL && *ptr != NULL) {
    free((*ptr)->values);
    (*ptr)->values = NULL;
    free(*ptr);
    *ptr = NULL;
  }
}

然后我的主要:

int main(int argc, char *argv[]) {
  matrix_t *M[4] = {NULL};
  char op[2] = {0};
  int op_ret[2] = {0};
  M[0] = matrix_input();
  scanf(" %c", &op[0]);
  M[1] = matrix_input();
  M[2] = calc(M[0], M[1],op[0]);
  matrix_print(M[2]);
  deallocate_matrix((matrix_t **)&M[1]);
  assert(M[1] == NULL); //this looks ok, M[1] is NULL
  return 0;
}

但是,如果我像这样使用函数calc省略deallocate_matrix((matrix_t **)&M[1]);和取消分配:

matrix_t *calc(matrix_t *A, matrix_t *B, char op) {
  matrix_t *M = NULL;
  //some code to compute M
  deallocate_matrix((matrix_t **)&A);
  deallocate_matrix((matrix_t **)&B);
  return M;
}

断言 M[1]==NULL 会失败,所以我显然在 calc 函数中做错了,但我不确定是什么。

标签: c

解决方案


你的代码是正确的。assert是错的。摆脱它,你不会有问题。你已经释放了矩阵。

calc正在发生A的事情是B按价值计算的。所以它不能改变AB在调用者中的值。所以他们不会NULL在电话之后。

  M[2] = calc(M[0], M[1],op[0]);

在这里,我们将 和的值传递给。所以不能改变or的值,因为它没有得到指向它们的指针。没关系。没有理由应该这样做。M[0]M[1]calccalcM[0]M[1]

NULL当您释放指针指向的内容时,请改掉无意义地设置指针的习惯。你的代码越复杂,它就会引起很多痛苦。

你看到了工作的方式free,对吧?你的函数应该以同样的方式工作,所以:

void deallocate_matrix(matrix_t *ptr) {
  if (ptr != NULL) {
    free(ptr->values);
    free(ptr);
  }
}

简单易用。


推荐阅读