将指向指向int的指针的指针强制转换为指向指向double的指针的指针是否正确?

时间:2014-01-30 14:53:20

标签: c

我有一个函数可以释放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);

2 个答案:

答案 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);
}