我有一个函数可以释放double
:
free_matrix(double ***U, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
free(U[i][j]);
}
free(U[i]);
}
free(U);
}
然后我有一个整数int ***matrix;
的立方矩阵。当我调用free_matrix(matrix,n)
时编译器给出了一个错误,但我不想复制只释放元素的前一个函数。简单地投射它是正确/好/安全吗?
free_matrix((double ***)matrix,n);
答案 0 :(得分:8)
不幸的是没有;根据6.2.5p28:
[...]指向其他类型的指针不需要具有相同的表示或对齐要求。
因此无法保证int **
的索引方式与double **
相同,因为int *
和double *
可能会例如{{1}}。有不同的尺寸。
答案 1 :(得分:0)
正如@ecatmur所指出的,你提出的建议通常是不安全的。我宁愿尝试将C函数的界面更改为以下内容(为简单起见,我假设为2D):
int ** imatrix_alloc(size_t nrows, size_t ncols);
double ** dmatrix_alloc(size_t nrows, size_t ncols);
void matrix_free (void * matrix);
并在客户端代码中使用它,如:
int ** imat = imatrix_alloc(10,20);
double ** fmat = dmatrix_alloc(30,20);
...
matrix_free(imat);
matrix_free(fmat);
分配中的棘手问题是预先计算所需的所有空间,并通过一次调用malloc
来分配它。然后你应该适当地初始化指针。如果你这样做matrix_free
可以作为一个简单的自由包装器来实现:
void matrix_free (void * matrix) {
free(matrix);
}