2014-01-30 293 views
1

我有解除分配的double立方矩陣的函數:將指針指向指向指向int的指針的指針指向指向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

不,它不是,因爲不同類型的指針都不能保證是相同的大小。你應該做的是實現一個類型通用的宏,其正文是你的代碼。一些東西'#define FREE_MAT(T)free_matrix_ ## T(T ** U,int n){...}' –

回答

8

不幸的是不是;每6.2.5p28:

[...]其他類型的指針不需要具有相同的表示或對齊要求。

所以沒有保證一個int **可以被索引的方式爲double **一樣,因爲int *double *可能例如有不同的尺寸。

+0

謝謝你的回答。那麼問題是當我使用U [i]和U [i] [j],這些不能保證指向數組的開始。 – HAL9000

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