c - 返回 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 函数中做错了,但我不确定是什么。
解决方案
你的代码是正确的。assert
是错的。摆脱它,你不会有问题。你已经释放了矩阵。
calc
正在发生A
的事情是B
按价值计算的。所以它不能改变A
或B
在调用者中的值。所以他们不会NULL
在电话之后。
M[2] = calc(M[0], M[1],op[0]);
在这里,我们将 和的值传递给。所以不能改变or的值,因为它没有得到指向它们的指针。没关系。没有理由应该这样做。M[0]
M[1]
calc
calc
M[0]
M[1]
NULL
当您释放指针指向的内容时,请改掉无意义地设置指针的习惯。你的代码越复杂,它就会引起很多痛苦。
你看到了工作的方式free
,对吧?你的函数应该以同样的方式工作,所以:
void deallocate_matrix(matrix_t *ptr) {
if (ptr != NULL) {
free(ptr->values);
free(ptr);
}
}
简单易用。