Re: [問題] 四維動態陣列無法free掉

看板C_and_CPP (C/C++)作者 (鬼翼&娃娃魚)時間16年前 (2009/03/27 09:49), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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
感覺只有free三層 最後一層並沒有free掉
03/27 11:46, 2F
文章代碼(AID): #19p32Oea (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #19p32Oea (C_and_CPP)