Re: [問題] 四維動態陣列無法free掉
※ 引述《wope (獨立黑色色彩)》之銘言:
: 我一始先宣告一個U[DimN1][DimN2][DimN3][DimT1]的動態陣列
: 但我free不掉
: 我不知道哪裡出了問題
: 請大家幫我看看
: #include <stdio.h> /*stdio.h printf的功能*/
: #include <stdlib.h> /*system指令的程式庫*/
: #include <math.h> /*數學指令的程式庫*/
: #include <conio.h>
: int main( void )
: {
: int DimN1=10,DimN2=10,DimN3=10,DimT1=10;/*隨不同問題改值*/
: /*產生 U[DimN1][DimN2][DimN3][DimT1]*/
: double ****U = (double****)malloc( DimN1+1*sizeof(int***) );
DimN1 = 10, sizeof(int***)一般32bit環境下是4....
所以你這裡只malloc了14 bytes的空間出來....
照code邏輯, 應該要用malloc( (DimN1+1)*sizeof(....) );
DimN2後面到DimT1都有同樣的問題在....
另外, malloc(sizeof(int*))出來轉型為double*這個寫法很不直覺....
因為指向不同型態的pointer其size都一樣, 所以這個例子還不會有錯....
如果哪天您malloc(sizeof(int))然後assign給double*就等著炸了@_@"
既然要配置的是double pointer, 那就用sizeof(double*)去malloc()
PS. 剛看到, 下面DimT1那一個維度的malloc就會有問題了....
: int i, j,k,k1;
: for(i=0; i<DimN1+1; i++) {
: U[i] = (double***)malloc( DimN2+1*sizeof(int**) );
: for(j=0; j<DimN2+1; j++) {
: U[i][j] = (double**)malloc(DimN3+1*sizeof(int*) );
: for(k=0; k<DimN3+1; k++) {
: U[i][j][k] = (double*)malloc(DimT1+1*sizeof(int) );
: }
: }
: }
: /* 用完記得free, 反向順序*/
: for(i=0; i<DimN1; i++) {
: for(j=0; j<DimN2; j++) {
: for(k=0; k<DimN3; k++) {
: free(U[i][j][k]);
: }
: free(U[i][j]);
: }
: free(U[i]);
: }
: free(U);
: }
如果小弟原先推測的code邏輯沒有錯, 您這裡free的空間也不夠....
要是用(DimN1+1)的size要, free的時候記得跑同樣次數的迴圈還....
所以看起來for loop應該都要跑到i<=DimN1, 到Dim##類推....:)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.66.243.96
※ 編輯: VictorTom 來自: 61.66.243.96 (03/27 09:55)
推
03/27 09:58, , 1F
03/27 09:58, 1F
推
03/27 11:46, , 2F
03/27 11:46, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章